163 lines
5.1 KiB
JavaScript
163 lines
5.1 KiB
JavaScript
import { tools } from "@cqsjjb/jjb-common-lib";
|
||
import { useAntdTable } from "ahooks";
|
||
|
||
const { query } = tools.router;
|
||
|
||
/**
|
||
* 获取数据
|
||
*/
|
||
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,
|
||
};
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 将搜索表单项和分页参数保存到 URL 中
|
||
*/
|
||
function setQuery(searchForm, pagination) {
|
||
// 将对象转换为键值对字符串格式
|
||
const getJoinString = (data) => {
|
||
const keys = [];
|
||
const values = [];
|
||
Object.entries(data).forEach(([key, value]) => {
|
||
if (value) {
|
||
keys.push(key);
|
||
if (Array.isArray(value)) {
|
||
// 数组值使用方括号包裹,并用竖线分隔
|
||
values.push(`[${value.join("|")}]`);
|
||
}
|
||
else {
|
||
values.push(value);
|
||
}
|
||
}
|
||
});
|
||
return { keys: keys.join(","), values: values.join(",") };
|
||
};
|
||
|
||
// 获取搜索表单和分页数据的键值对字符串
|
||
const searchFormData = getJoinString(searchForm);
|
||
const paginationData = getJoinString(pagination);
|
||
|
||
// 将数据存储到 URL 查询参数中
|
||
query.searchFormKeys = searchFormData.keys;
|
||
query.searchFormValues = searchFormData.values;
|
||
query.paginationKeys = paginationData.keys;
|
||
query.paginationValues = paginationData.values;
|
||
}
|
||
|
||
/**
|
||
* 从 URL 中获取查询参数
|
||
*/
|
||
function getQuery(keysStr, valuesStr) {
|
||
// 将键值字符串分割为数组
|
||
const keys = keysStr ? keysStr.split(",") : [];
|
||
const values = valuesStr ? valuesStr.split(",") : [];
|
||
|
||
// 构建结果对象
|
||
const resultMap = {};
|
||
keys.forEach((key, index) => {
|
||
if (values[index]) {
|
||
// 处理数组值(方括号包裹的值)
|
||
if (values[index].startsWith("[") && values[index].endsWith("]")) {
|
||
const arrayContent = values[index].substring(1, values[index].length - 1);
|
||
resultMap[key] = arrayContent ? arrayContent.split("|") : [];
|
||
}
|
||
else {
|
||
// 处理普通值
|
||
resultMap[key] = values[index];
|
||
}
|
||
}
|
||
});
|
||
return resultMap;
|
||
}
|
||
|
||
/**
|
||
* 自定义 useTable,继承 ahooks 的 useAntdTable,根据需求进行扩展
|
||
*/
|
||
function useTable(service, options) {
|
||
// 获取额外参数和转换函数
|
||
const { params: extraParams, transform, ...restOptions } = options || {};
|
||
|
||
// 获取配置项
|
||
const {
|
||
useStorageQueryCriteria = true,
|
||
usePagination = true,
|
||
defaultType = "advance",
|
||
defaultCurrent = 1,
|
||
defaultPageSize = 10,
|
||
defaultPagination = { current: defaultCurrent, pageSize: defaultPageSize },
|
||
...restRestOptions
|
||
} = restOptions;
|
||
|
||
// 获取存储的查询条件
|
||
const storageQueryCriteriaSearchForm = useStorageQueryCriteria ? getQuery(query.searchFormKeys, query.searchFormValues) : {};
|
||
const storageQueryCriteriaPagination = useStorageQueryCriteria && usePagination ? getQuery(query.paginationKeys, query.paginationValues) : {};
|
||
|
||
// 确定实际使用的搜索表单和分页参数
|
||
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
|
||
useStorageQueryCriteria && setQuery(
|
||
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;
|