生产管理系统 - 页面上路由参数缓存
This commit is contained in:
@@ -242,43 +242,103 @@ export default function AuditHistoryPage() {
|
||||
date_range: 'all'
|
||||
});
|
||||
|
||||
// 数据加载函数 - 移除不必要的依赖避免重复调用
|
||||
const loadAuditHistory = useCallback(async (params?: {
|
||||
// 数据加载函数 - 优先从浏览器URL参数读取
|
||||
const loadAuditHistory = useCallback(async (options: {
|
||||
resetPage?: boolean;
|
||||
filters?: Record<string, string>;
|
||||
pagination?: { page: number; size: number };
|
||||
sort?: { sortBy?: string; sortOrder?: 'asc' | 'desc' };
|
||||
}) => {
|
||||
sortBy?: string;
|
||||
sortOrder?: 'asc' | 'desc';
|
||||
page?: number;
|
||||
size?: number;
|
||||
} = {}) => {
|
||||
try {
|
||||
console.log('调用了loadAuditHistory');
|
||||
// 优先从URL读取参数
|
||||
let urlParams = {};
|
||||
if (typeof window !== 'undefined') {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
urlParams = {
|
||||
search: params.get('search') || undefined,
|
||||
action: params.get('action') || undefined,
|
||||
audit_status: params.get('audit_status') || undefined,
|
||||
date_range: params.get('date_range') || undefined,
|
||||
page: params.get('page') ? parseInt(params.get('page')!, 10) : undefined,
|
||||
size: params.get('size') ? parseInt(params.get('size')!, 10) : undefined
|
||||
};
|
||||
console.log('从URL读取的参数:', urlParams);
|
||||
}
|
||||
console.log('========================================');
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
const finalParams: AuditLogsQueryParams = {
|
||||
search_keyword: (params?.filters?.search ?? searchFilters.search) || undefined,
|
||||
action: params?.filters?.action ?? searchFilters.action,
|
||||
audit_status: params?.filters?.audit_status ?? searchFilters.audit_status,
|
||||
date_range: params?.filters?.date_range ?? searchFilters.date_range,
|
||||
page: params?.pagination?.page || pagination.page,
|
||||
size: params?.pagination?.size || pagination.size,
|
||||
order_by: params?.sort?.sortBy,
|
||||
sort_order: params?.sort?.sortOrder,
|
||||
// 解构选项参数,提供默认值
|
||||
const {
|
||||
resetPage = false,
|
||||
filters,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
page,
|
||||
size
|
||||
} = options;
|
||||
|
||||
// 优先级:URL参数 > 传入参数 > 父组件状态
|
||||
const finalPage = resetPage ? 1 : (urlParams.page || page || pagination.page);
|
||||
const finalSize = urlParams.size || size || pagination.size;
|
||||
|
||||
const params: AuditLogsQueryParams = {
|
||||
page: finalPage,
|
||||
size: finalSize,
|
||||
};
|
||||
|
||||
// 处理筛选条件,如果为'all'则不传该参数
|
||||
if (finalParams.action === 'all') {
|
||||
finalParams.action = undefined;
|
||||
}
|
||||
if (finalParams.audit_status === 'all') {
|
||||
finalParams.audit_status = undefined;
|
||||
}
|
||||
if (finalParams.date_range === 'all') {
|
||||
finalParams.date_range = undefined;
|
||||
// 使用正确的优先级:URL参数 > 传入参数 > 父组件状态
|
||||
const currentFilters = {
|
||||
search: urlParams.search || (filters?.search) || searchFilters.search,
|
||||
action: urlParams.action || (filters?.action) || searchFilters.action,
|
||||
audit_status: urlParams.audit_status || (filters?.audit_status) || searchFilters.audit_status,
|
||||
date_range: urlParams.date_range || (filters?.date_range) || searchFilters.date_range
|
||||
};
|
||||
const currentSortBy = sortBy || 'created_at';
|
||||
const currentSortOrder = sortOrder || 'desc';
|
||||
|
||||
// 添加搜索条件
|
||||
if (currentFilters.search) {
|
||||
params.search_keyword = currentFilters.search;
|
||||
}
|
||||
|
||||
const response = await fetchAuditLogs(finalParams);
|
||||
if (currentFilters.action && currentFilters.action !== 'all') {
|
||||
params.action = currentFilters.action;
|
||||
}
|
||||
|
||||
if (currentFilters.audit_status && currentFilters.audit_status !== 'all') {
|
||||
params.audit_status = currentFilters.audit_status;
|
||||
}
|
||||
|
||||
if (currentFilters.date_range && currentFilters.date_range !== 'all') {
|
||||
params.date_range = currentFilters.date_range;
|
||||
}
|
||||
|
||||
if (currentSortBy) {
|
||||
params.order_by = currentSortBy;
|
||||
params.sort_order = currentSortOrder;
|
||||
}
|
||||
|
||||
console.log('=== 审核历史页面 - 最终API参数 ===');
|
||||
console.log('API调用参数 params:', params);
|
||||
console.log('参数优先级正确: URL参数 > 函数传递参数 > 父组件状态');
|
||||
console.log('当前currentFilters:', currentFilters);
|
||||
console.log('==================================');
|
||||
|
||||
const response = await fetchAuditLogs(params);
|
||||
const transformedData = response.data.map(transformAuditLogData);
|
||||
|
||||
setRecords(transformedData);
|
||||
setPagination({
|
||||
page: response.page,
|
||||
size: response.size,
|
||||
total: response.total,
|
||||
totalPages: response.total_pages,
|
||||
hasNext: response.has_next,
|
||||
hasPrev: response.has_prev,
|
||||
});
|
||||
} catch (err) {
|
||||
const errorMessage = err instanceof Error ? err.message : '加载审核历史失败';
|
||||
setError(errorMessage);
|
||||
@@ -286,7 +346,7 @@ export default function AuditHistoryPage() {
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [searchFilters, pagination]); // 添加依赖以保持函数引用最新
|
||||
}, []); // 移除依赖项,通过参数传递
|
||||
|
||||
const didFetchRef = useRef(false)
|
||||
|
||||
@@ -295,38 +355,94 @@ useEffect(() => {
|
||||
didFetchRef.current = true
|
||||
loadAuditHistory()
|
||||
}, [])
|
||||
// 事件处理器
|
||||
// 搜索处理 - 保持传统的简洁方式
|
||||
const handleSearch = useCallback((filters: Record<string, string>) => {
|
||||
setSearchFilters(filters);
|
||||
// 搜索时重置到第一页
|
||||
loadAuditHistory({
|
||||
filters,
|
||||
pagination: { page: 1, size: pagination.size }
|
||||
});
|
||||
}, [loadAuditHistory, pagination.size]);
|
||||
console.log('审核历史页面 - 收到搜索条件:', filters);
|
||||
|
||||
// 更新过滤器状态
|
||||
setSearchFilters(filters);
|
||||
|
||||
// 搜索时重置到第1页
|
||||
setPagination(prev => ({ ...prev, page: 1 }));
|
||||
|
||||
// 执行查询
|
||||
loadAuditHistory({
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: filters,
|
||||
size: pagination.size
|
||||
});
|
||||
|
||||
console.log('触发审核历史查询 - 参数:', {
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: filters,
|
||||
size: pagination.size
|
||||
});
|
||||
}, [pagination.size, loadAuditHistory]);
|
||||
|
||||
// 排序处理
|
||||
const handleSort = useCallback((sortBy: string, sortOrder: 'asc' | 'desc') => {
|
||||
// 排序时重置到第一页
|
||||
setPagination(prev => ({ ...prev, page: 1 }));
|
||||
loadAuditHistory({
|
||||
pagination: { page: 1, size: pagination.size },
|
||||
sort: { sortBy, sortOrder }
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: searchFilters,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
size: pagination.size
|
||||
});
|
||||
}, [loadAuditHistory, pagination.size]);
|
||||
}, [searchFilters, pagination.size, loadAuditHistory]);
|
||||
|
||||
// 分页处理
|
||||
const handlePageChange = useCallback((page: number) => {
|
||||
if (page < 1) {
|
||||
page = 1;
|
||||
} else if (page > pagination.totalPages && pagination.totalPages > 0) {
|
||||
page = pagination.totalPages;
|
||||
}
|
||||
setPagination(prev => ({ ...prev, page }));
|
||||
loadAuditHistory({
|
||||
page,
|
||||
filters: searchFilters,
|
||||
pagination: { page, size: pagination.size }
|
||||
size: pagination.size
|
||||
});
|
||||
}, [loadAuditHistory, searchFilters, pagination.size]);
|
||||
}, [searchFilters, pagination.size, pagination.totalPages, loadAuditHistory]);
|
||||
|
||||
// 每页条数变化处理
|
||||
const handleSizeChange = useCallback((size: number) => {
|
||||
setPagination(prev => ({ ...prev, size, page: 1 }));
|
||||
loadAuditHistory({
|
||||
filters: searchFilters,
|
||||
pagination: { page: 1, size }
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
size,
|
||||
filters: searchFilters
|
||||
});
|
||||
}, [loadAuditHistory, searchFilters]);
|
||||
}, [searchFilters, loadAuditHistory]);
|
||||
|
||||
// URL状态变化处理 - 处理浏览器前进后退时的参数恢复
|
||||
const handleUrlStateChange = useCallback((urlState: {
|
||||
filters: Record<string, string>;
|
||||
pagination: { page: number; size: number };
|
||||
}) => {
|
||||
console.log('审核历史页面 - URL状态变化:', urlState);
|
||||
|
||||
// 更新内部状态
|
||||
setSearchFilters(urlState.filters);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
page: urlState.pagination.page,
|
||||
size: urlState.pagination.size
|
||||
}));
|
||||
|
||||
// 触发数据加载
|
||||
loadAuditHistory({
|
||||
page: urlState.pagination.page,
|
||||
size: urlState.pagination.size,
|
||||
filters: urlState.filters
|
||||
});
|
||||
}, [loadAuditHistory]);
|
||||
|
||||
// 业务事件处理器
|
||||
const handleView = (record: AuditLogData) => {
|
||||
@@ -381,7 +497,8 @@ useEffect(() => {
|
||||
emptyIcon={<FileText className="w-12 h-12 mx-auto mb-4 opacity-20" />}
|
||||
emptyText="暂无审核记录"
|
||||
sizeOptions={[10, 20, 50, 100]}
|
||||
/>
|
||||
|
||||
/>
|
||||
|
||||
{/* View Audit Record Details Dialog */}
|
||||
<Dialog open={dialogs.showViewDialog} onOpenChange={(open) => dispatch({ type: 'TOGGLE_VIEW_DIALOG', payload: open })}>
|
||||
|
||||
@@ -165,12 +165,13 @@ export default function EnterpriseAuditPage() {
|
||||
sortable: false, // 禁用排序
|
||||
render: (value: string) => {
|
||||
const statusConfig = {
|
||||
'草稿': { label: '草稿', variant: 'default' as const, className: 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200' },
|
||||
'待审核': { label: '待审核', variant: 'default' as const, className: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200' },
|
||||
'已通过': { label: '已通过', variant: 'default' as const, className: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' },
|
||||
'已驳回': { label: '已驳回', variant: 'default' as const, className: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' },
|
||||
'已拒绝': { label: '已拒绝', variant: 'default' as const, className: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' },
|
||||
};
|
||||
|
||||
const config = statusConfig[value as keyof typeof statusConfig] || statusConfig['待审核'];
|
||||
const config = statusConfig[value as keyof typeof statusConfig] || statusConfig['草稿'];
|
||||
return (
|
||||
<Badge className={`font-light ${config.className}`}>
|
||||
{config.label}
|
||||
@@ -227,31 +228,53 @@ export default function EnterpriseAuditPage() {
|
||||
didFetchRef.current = true
|
||||
loadEnterprises()
|
||||
}, [])
|
||||
// 加载企业数据 - 移除依赖项,通过参数传递状态
|
||||
const loadEnterprises = useCallback(async (params?: {
|
||||
filters?: Record<string, string>;
|
||||
pagination?: { page: number; size: number };
|
||||
sort?: { sortBy?: string; sortOrder: 'asc' | 'desc' };
|
||||
// 加载企业数据 - 统一参数结构
|
||||
const loadEnterprises = useCallback(async (options: {
|
||||
resetPage?: boolean;
|
||||
}) => {
|
||||
filters?: Record<string, string>;
|
||||
sortBy?: string;
|
||||
sortOrder?: 'asc' | 'desc';
|
||||
page?: number;
|
||||
size?: number;
|
||||
} = {}) => {
|
||||
try {
|
||||
dispatch({ type: 'SET_LOADING', payload: true });
|
||||
|
||||
const finalParams: TenantsQueryParams = {
|
||||
search: (params?.filters?.search ?? state.filters.search) || undefined,
|
||||
audit_status: params?.filters?.audit_status ?? state.filters.audit_status,
|
||||
page: params?.resetPage ? 1 : (params?.pagination?.page || state.pagination.page),
|
||||
size: params?.pagination?.size || state.pagination.size,
|
||||
order_by: params?.sort?.sortBy,
|
||||
sort_order: params?.sort?.sortOrder,
|
||||
// 解构选项参数,提供默认值
|
||||
const {
|
||||
resetPage = false,
|
||||
filters,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
page,
|
||||
size
|
||||
} = options;
|
||||
|
||||
const params: TenantsQueryParams = {
|
||||
page: resetPage ? 1 : (page || state.pagination.page),
|
||||
size: size || state.pagination.size,
|
||||
};
|
||||
|
||||
// 处理audit_status,如果为'all'则不传该参数
|
||||
if (finalParams.audit_status === 'all') {
|
||||
finalParams.audit_status = undefined;
|
||||
// 使用传入的过滤器参数,如果没有传入则使用当前状态
|
||||
const currentFilters = filters || state.filters;
|
||||
const currentSortBy = sortBy || 'created_at';
|
||||
const currentSortOrder = sortOrder || 'desc';
|
||||
|
||||
// 添加搜索条件
|
||||
if (currentFilters.search) {
|
||||
params.search = currentFilters.search;
|
||||
}
|
||||
|
||||
const response = await fetchTenantsForAudit(finalParams);
|
||||
if (currentFilters.audit_status && currentFilters.audit_status !== 'all') {
|
||||
params.audit_status = currentFilters.audit_status;
|
||||
}
|
||||
|
||||
if (currentSortBy) {
|
||||
params.order_by = currentSortBy;
|
||||
params.sort_order = currentSortOrder;
|
||||
}
|
||||
|
||||
const response = await fetchTenantsForAudit(params);
|
||||
const transformedData = response.data.map(transformTenantData);
|
||||
|
||||
dispatch({
|
||||
@@ -284,24 +307,49 @@ export default function EnterpriseAuditPage() {
|
||||
rejected: state.enterprises.filter(e => e.auditStatus === '已驳回').length,
|
||||
}), [state.enterprises, state.pagination.total]);
|
||||
|
||||
// 事件处理器
|
||||
// 搜索处理 - 保持传统的简洁方式
|
||||
const handleSearch = useCallback((filters: Record<string, string>) => {
|
||||
console.log('企业审核页面 - 收到搜索条件:', filters);
|
||||
|
||||
// 更新过滤器状态
|
||||
dispatch({ type: 'SET_FILTERS', payload: filters });
|
||||
loadEnterprises({
|
||||
filters,
|
||||
pagination: { page: 1, size: state.pagination.size }
|
||||
});
|
||||
}, [loadEnterprises, state.pagination.size]);
|
||||
|
||||
// 搜索时重置到第1页
|
||||
dispatch({ type: 'SET_PAGINATION', payload: { page: 1 } });
|
||||
|
||||
// 执行查询
|
||||
loadEnterprises({
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: filters,
|
||||
size: state.pagination.size
|
||||
});
|
||||
|
||||
console.log('触发企业审核查询 - 参数:', {
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: filters,
|
||||
size: state.pagination.size
|
||||
});
|
||||
}, [state.pagination.size, loadEnterprises]);
|
||||
|
||||
// 排序处理
|
||||
const handleSort = useCallback((sortBy: string, sortOrder: 'asc' | 'desc') => {
|
||||
// 排序时重置到第1页
|
||||
dispatch({ type: 'SET_SORT', payload: { sortBy, sortOrder } });
|
||||
loadEnterprises({
|
||||
filters: state.filters,
|
||||
sort: { sortBy, sortOrder },
|
||||
resetPage: true
|
||||
});
|
||||
}, [loadEnterprises, state.filters]);
|
||||
dispatch({ type: 'SET_PAGINATION', payload: { page: 1 } });
|
||||
|
||||
loadEnterprises({
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: state.filters,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
size: state.pagination.size
|
||||
});
|
||||
}, [state.filters, state.pagination.size, loadEnterprises]);
|
||||
|
||||
// 分页处理
|
||||
const handlePageChange = useCallback((page: number) => {
|
||||
// 边界检查,确保页码在有效范围内
|
||||
if (page < 1) {
|
||||
@@ -309,20 +357,47 @@ export default function EnterpriseAuditPage() {
|
||||
} else if (page > state.pagination.totalPages && state.pagination.totalPages > 0) {
|
||||
page = state.pagination.totalPages;
|
||||
}
|
||||
|
||||
dispatch({ type: 'SET_PAGINATION', payload: { page } });
|
||||
loadEnterprises({
|
||||
page,
|
||||
filters: state.filters,
|
||||
pagination: { page, size: state.pagination.size }
|
||||
size: state.pagination.size
|
||||
});
|
||||
}, [loadEnterprises, state.filters, state.pagination.size, state.pagination.totalPages]);
|
||||
}, [state.filters, state.pagination.size, state.pagination.totalPages, loadEnterprises]);
|
||||
|
||||
// 每页条数变化处理
|
||||
const handleSizeChange = useCallback((size: number) => {
|
||||
dispatch({ type: 'SET_PAGINATION', payload: { size, page: 1 } });
|
||||
loadEnterprises({
|
||||
filters: state.filters,
|
||||
pagination: { page: 1, size }
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
size,
|
||||
filters: state.filters
|
||||
});
|
||||
}, [loadEnterprises, state.filters]);
|
||||
}, [state.filters, loadEnterprises]);
|
||||
|
||||
// URL状态变化处理 - 处理浏览器前进后退时的参数恢复
|
||||
const handleUrlStateChange = useCallback((urlState: {
|
||||
filters: Record<string, string>;
|
||||
pagination: { page: number; size: number };
|
||||
}) => {
|
||||
console.log('企业审核页面 - URL状态变化:', urlState);
|
||||
|
||||
// 更新内部状态
|
||||
dispatch({ type: 'SET_FILTERS', payload: urlState.filters });
|
||||
dispatch({ type: 'SET_PAGINATION', payload: {
|
||||
page: urlState.pagination.page,
|
||||
size: urlState.pagination.size
|
||||
}});
|
||||
|
||||
// 触发数据加载
|
||||
loadEnterprises({
|
||||
page: urlState.pagination.page,
|
||||
size: urlState.pagination.size,
|
||||
filters: urlState.filters
|
||||
});
|
||||
}, [loadEnterprises]);
|
||||
|
||||
const handleRefresh = useCallback(() => {
|
||||
dispatch({ type: 'REFRESH_DATA' });
|
||||
@@ -435,12 +510,6 @@ export default function EnterpriseAuditPage() {
|
||||
{/* 搜索、表格和分页 - 使用重构后的组件 */}
|
||||
<SearchFormPagination
|
||||
formTitle="企业列表"
|
||||
formRightContent={
|
||||
<Button variant="outline" onClick={handleRefresh} disabled={state.loading}>
|
||||
<RefreshCw className={`w-4 h-4 mr-2 ${state.loading ? 'animate-spin' : ''}`} />
|
||||
刷新
|
||||
</Button>
|
||||
}
|
||||
searchFields={searchFields}
|
||||
columns={columns}
|
||||
data={state.enterprises}
|
||||
@@ -458,7 +527,8 @@ export default function EnterpriseAuditPage() {
|
||||
showSizeSelector={true}
|
||||
showPageInfo={true}
|
||||
sizeOptions={[10, 20, 50, 100]}
|
||||
/>
|
||||
|
||||
/>
|
||||
|
||||
{/* 企业详情对话框 - 保留原有功能 */}
|
||||
<EnterpriseDetailDialog
|
||||
|
||||
@@ -246,30 +246,85 @@ export default function EnterpriseManagement() {
|
||||
didFetchRef.current = true
|
||||
loadEnterprises()
|
||||
}, [])
|
||||
// 数据加载函数 - 移除不必要的依赖避免重复调用
|
||||
const loadEnterprises = useCallback(async (params?: {
|
||||
// 数据加载函数 - 参考audit-history页面的统一参数结构,优先从URL参数读取
|
||||
const loadEnterprises = useCallback(async (options: {
|
||||
resetPage?: boolean;
|
||||
filters?: Record<string, string>;
|
||||
pagination?: { page: number; size: number };
|
||||
sort?: { sortBy?: string; sortOrder?: 'asc' | 'desc' };
|
||||
}) => {
|
||||
sortBy?: string;
|
||||
sortOrder?: 'asc' | 'desc';
|
||||
page?: number;
|
||||
size?: number;
|
||||
} = {}) => {
|
||||
try {
|
||||
console.log('调用了loadEnterprises')
|
||||
console.log('=== 企业管理页面 - loadEnterprises 调用 ===');
|
||||
console.log('传入的options参数:', options);
|
||||
console.log('当前searchFilters:', searchFilters);
|
||||
console.log('当前pagination:', pagination);
|
||||
|
||||
// 优先从URL读取参数
|
||||
let urlParams = {};
|
||||
if (typeof window !== 'undefined') {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
urlParams = {
|
||||
search: params.get('search') || undefined,
|
||||
audit_status: params.get('audit_status') || undefined,
|
||||
page: params.get('page') ? parseInt(params.get('page')!, 10) : undefined,
|
||||
size: params.get('size') ? parseInt(params.get('size')!, 10) : undefined
|
||||
};
|
||||
console.log('从URL读取的参数:', urlParams);
|
||||
}
|
||||
|
||||
console.log('========================================');
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
// 解构选项参数,提供默认值
|
||||
const {
|
||||
resetPage = false,
|
||||
filters,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
page,
|
||||
size
|
||||
} = options;
|
||||
|
||||
// 优先级:URL参数 > 传入参数 > 父组件状态
|
||||
const finalPage = resetPage ? 1 : (page || urlParams.page || pagination.page);
|
||||
const finalSize = size || urlParams.size || pagination.size;
|
||||
|
||||
const finalParams: TenantsQueryParams = {
|
||||
search: (params?.filters?.search ?? searchFilters.search) || undefined,
|
||||
audit_status: params?.filters?.audit_status ?? searchFilters.audit_status,
|
||||
page: params?.pagination?.page || pagination.page,
|
||||
size: params?.pagination?.size || pagination.size,
|
||||
order_by: params?.sort?.sortBy,
|
||||
sort_order: params?.sort?.sortOrder,
|
||||
page: finalPage,
|
||||
size: finalSize,
|
||||
};
|
||||
|
||||
// 处理audit_status,如果为'all'则不传该参数
|
||||
if (finalParams.audit_status === 'all') {
|
||||
finalParams.audit_status = undefined;
|
||||
// 使用正确的优先级:URL参数 > 传入参数 > 父组件状态
|
||||
const currentFilters = {
|
||||
search: urlParams.search || (filters?.search) || searchFilters.search,
|
||||
audit_status: urlParams.audit_status || (filters?.audit_status) || searchFilters.audit_status
|
||||
};
|
||||
const currentSortBy = sortBy || 'created_at';
|
||||
const currentSortOrder = sortOrder || 'desc';
|
||||
|
||||
// 添加搜索条件
|
||||
if (currentFilters.search) {
|
||||
finalParams.search = currentFilters.search;
|
||||
}
|
||||
|
||||
if (currentFilters.audit_status && currentFilters.audit_status !== 'all') {
|
||||
finalParams.audit_status = currentFilters.audit_status;
|
||||
}
|
||||
|
||||
if (currentSortBy) {
|
||||
finalParams.order_by = currentSortBy;
|
||||
finalParams.sort_order = currentSortOrder;
|
||||
}
|
||||
|
||||
console.log('=== 企业管理页面 - 最终API参数 ===');
|
||||
console.log('API调用参数 finalParams:', finalParams);
|
||||
console.log('参数优先级正确: URL参数 > 传入参数 > 父组件状态');
|
||||
console.log('当前currentFilters:', currentFilters);
|
||||
console.log('==================================');
|
||||
|
||||
const response = await fetchTenants(finalParams);
|
||||
const transformedData = response.data.map(transformTenantData);
|
||||
|
||||
@@ -291,51 +346,105 @@ export default function EnterpriseManagement() {
|
||||
}
|
||||
}, []); // 移除所有依赖,使用参数传递状态变化
|
||||
|
||||
// 事件处理器
|
||||
// 搜索处理 - 参考audit-history页面的统一方式
|
||||
const handleSearch = useCallback((filters: Record<string, string>) => {
|
||||
setSearchFilters(filters);
|
||||
// 搜索时重置到第一页
|
||||
loadEnterprises({
|
||||
filters,
|
||||
pagination: { page: 1, size: pagination.size }
|
||||
});
|
||||
}, [loadEnterprises, pagination.size]);
|
||||
console.log('企业管理页面 - 收到搜索条件:', filters);
|
||||
|
||||
const handleSort = useCallback((sortBy: string, sortOrder: 'asc' | 'desc') => {
|
||||
// 排序时重置到第一页
|
||||
// 更新过滤器状态
|
||||
setSearchFilters(filters);
|
||||
|
||||
// 搜索时重置到第1页
|
||||
setPagination(prev => ({ ...prev, page: 1 }));
|
||||
|
||||
// 执行查询
|
||||
loadEnterprises({
|
||||
pagination: { page: 1, size: pagination.size },
|
||||
sort: { sortBy, sortOrder }
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: filters,
|
||||
size: pagination.size
|
||||
});
|
||||
}, [loadEnterprises, pagination.size]);
|
||||
|
||||
console.log('触发企业管理查询 - 参数:', {
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: filters,
|
||||
size: pagination.size
|
||||
});
|
||||
}, [pagination.size, loadEnterprises]);
|
||||
|
||||
// 排序处理
|
||||
const handleSort = useCallback((sortBy: string, sortOrder: 'asc' | 'desc') => {
|
||||
// 排序时重置到第1页
|
||||
setPagination(prev => ({ ...prev, page: 1 }));
|
||||
|
||||
loadEnterprises({
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: searchFilters,
|
||||
sortBy,
|
||||
sortOrder,
|
||||
size: pagination.size
|
||||
});
|
||||
}, [searchFilters, pagination.size, loadEnterprises]);
|
||||
|
||||
// 统一的数据重载函数 - 避免重复代码
|
||||
const reloadData = useCallback(() => {
|
||||
const reloadParams = {
|
||||
filters: searchFilters,
|
||||
pagination: {
|
||||
page: pagination.page,
|
||||
size: pagination.size
|
||||
}
|
||||
};
|
||||
loadEnterprises(reloadParams);
|
||||
loadEnterprises({
|
||||
page: pagination.page,
|
||||
size: pagination.size,
|
||||
filters: searchFilters
|
||||
});
|
||||
}, [loadEnterprises, searchFilters, pagination]);
|
||||
|
||||
// 分页处理 - 参考audit-history页面的统一方式
|
||||
const handlePageChange = useCallback((page: number) => {
|
||||
// 边界检查,确保页码在有效范围内
|
||||
if (page < 1) {
|
||||
page = 1;
|
||||
} else if (page > pagination.totalPages && pagination.totalPages > 0) {
|
||||
page = pagination.totalPages;
|
||||
}
|
||||
setPagination(prev => ({ ...prev, page }));
|
||||
loadEnterprises({
|
||||
page,
|
||||
filters: searchFilters,
|
||||
pagination: { page, size: pagination.size }
|
||||
size: pagination.size
|
||||
});
|
||||
}, [loadEnterprises, searchFilters, pagination.size]);
|
||||
}, [searchFilters, pagination.size, pagination.totalPages, loadEnterprises]);
|
||||
|
||||
// 每页条数变化处理
|
||||
const handleSizeChange = useCallback((size: number) => {
|
||||
setPagination(prev => ({ ...prev, size, page: 1 }));
|
||||
loadEnterprises({
|
||||
filters: searchFilters,
|
||||
pagination: { page: 1, size }
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
size,
|
||||
filters: searchFilters
|
||||
});
|
||||
}, [loadEnterprises, searchFilters]);
|
||||
}, [searchFilters, loadEnterprises]);
|
||||
|
||||
// URL状态变化处理 - 处理浏览器前进后退时的参数恢复
|
||||
const handleUrlStateChange = useCallback((urlState: {
|
||||
filters: Record<string, string>;
|
||||
pagination: { page: number; size: number };
|
||||
}) => {
|
||||
console.log('企业管理页面 - URL状态变化:', urlState);
|
||||
|
||||
// 更新内部状态
|
||||
setSearchFilters(urlState.filters);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
page: urlState.pagination.page,
|
||||
size: urlState.pagination.size
|
||||
}));
|
||||
|
||||
// 触发数据加载
|
||||
loadEnterprises({
|
||||
page: urlState.pagination.page,
|
||||
size: urlState.pagination.size,
|
||||
filters: urlState.filters
|
||||
});
|
||||
}, [loadEnterprises]);
|
||||
|
||||
// 初始化数据加载
|
||||
// useEffect(() => {
|
||||
@@ -496,7 +605,7 @@ export default function EnterpriseManagement() {
|
||||
onSort={handleSort}
|
||||
emptyIcon={<Building2 className="w-12 h-12 mx-auto mb-4 opacity-20" />}
|
||||
emptyText="暂无企业数据"
|
||||
/>
|
||||
/>
|
||||
|
||||
{/* View Enterprise Details Dialog */}
|
||||
<Dialog open={dialogs.showViewDialog} onOpenChange={(open) => dispatch({ type: 'TOGGLE_VIEW_DIALOG', payload: open })}>
|
||||
|
||||
@@ -282,6 +282,20 @@ export default function TenantUserManagementPage() {
|
||||
size?: number;
|
||||
} = {}) => {
|
||||
try {
|
||||
// 优先从URL读取参数
|
||||
let urlParams = {};
|
||||
if (typeof window !== 'undefined') {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
urlParams = {
|
||||
search: params.get('search') || undefined,
|
||||
status: params.get('status') || undefined,
|
||||
type: params.get('type') || undefined,
|
||||
page: params.get('page') ? parseInt(params.get('page')!, 10) : undefined,
|
||||
size: params.get('size') ? parseInt(params.get('size')!, 10) : undefined
|
||||
};
|
||||
console.log('从URL读取的参数:', urlParams);
|
||||
}
|
||||
|
||||
dispatch({ type: 'SET_LOADING', payload: true });
|
||||
|
||||
// 解构选项参数,提供默认值
|
||||
@@ -294,14 +308,22 @@ export default function TenantUserManagementPage() {
|
||||
size
|
||||
} = options;
|
||||
|
||||
// 优先级:URL参数 > 传入参数 > 父组件状态
|
||||
const finalPage = resetPage ? 1 : (urlParams.page || page || state.pagination.page);
|
||||
const finalSize = urlParams.size || size || state.pagination.size;
|
||||
|
||||
const params: UsersQueryParams = {
|
||||
page: resetPage ? 1 : (page || state.pagination.page),
|
||||
size: size || state.pagination.size,
|
||||
page: finalPage,
|
||||
size: finalSize,
|
||||
is_active: true,
|
||||
};
|
||||
|
||||
// 使用传入的过滤器参数,如果没有传入则使用当前状态
|
||||
const currentFilters = filters || state.filters;
|
||||
// 使用正确的优先级:URL参数 > 传入参数 > 父组件状态
|
||||
const currentFilters = {
|
||||
searchKeyword: urlParams.search || (filters?.searchKeyword) || state.filters.searchKeyword,
|
||||
statusFilter: urlParams.status || (filters?.statusFilter) || state.filters.statusFilter,
|
||||
typeFilter: urlParams.type || (filters?.typeFilter) || state.filters.typeFilter
|
||||
};
|
||||
const currentSortBy = sortBy || state.sortBy;
|
||||
const currentSortOrder = sortOrder || state.sortOrder;
|
||||
|
||||
@@ -350,24 +372,41 @@ export default function TenantUserManagementPage() {
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 搜索处理
|
||||
// 搜索处理 - 保持传统的简洁方式
|
||||
const handleSearch = useCallback((filters: Record<string, string>) => {
|
||||
console.log('用户管理页面 - 收到搜索条件:', filters);
|
||||
|
||||
const mappedFilters = {
|
||||
searchKeyword: filters.search || '',
|
||||
statusFilter: filters.status || 'all',
|
||||
typeFilter: filters.type || 'all'
|
||||
};
|
||||
|
||||
// 更新过滤器状态
|
||||
dispatch({ type: 'SET_FILTERS', payload: mappedFilters });
|
||||
dispatch({ type: 'SET_PAGINATION', payload: { page: 1 } });
|
||||
// 传入所有当前参数,避免覆盖其他参数
|
||||
|
||||
// 搜索时重置到第1页
|
||||
dispatch({ type: 'SET_PAGINATION', payload: { page: 1, size: state.pagination.size } });
|
||||
|
||||
// 执行查询
|
||||
loadUsers({
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: mappedFilters,
|
||||
sortBy: state.sortBy,
|
||||
sortOrder: state.sortOrder,
|
||||
size: state.pagination.size
|
||||
});
|
||||
}, [state.sortBy, state.sortOrder, state.pagination.size]);
|
||||
|
||||
console.log('触发用户查询 - 参数:', {
|
||||
resetPage: true,
|
||||
page: 1,
|
||||
filters: mappedFilters,
|
||||
sortBy: state.sortBy,
|
||||
sortOrder: state.sortOrder,
|
||||
size: state.pagination.size
|
||||
});
|
||||
}, [state.sortBy, state.sortOrder, state.pagination.size, loadUsers]);
|
||||
|
||||
// 排序处理
|
||||
const handleSort = useCallback((sortBy: string, sortOrder: 'asc' | 'desc') => {
|
||||
@@ -504,7 +543,7 @@ export default function TenantUserManagementPage() {
|
||||
onSort={handleSort}
|
||||
emptyText="暂无用户数据"
|
||||
sizeOptions={[10, 20, 50, 100]}
|
||||
/>
|
||||
/>
|
||||
|
||||
{/* 用户详情对话框 */}
|
||||
<UserDetailDialog
|
||||
|
||||
Reference in New Issue
Block a user