diff --git a/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts b/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts index a215698b4..0ace80d05 100644 --- a/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts +++ b/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts @@ -12,6 +12,7 @@ import { exportSqlManageRemediationV1ExportScopeEnum, GetSqlManageListV2FilterSourceEnum, GetSqlManageListV2FilterAuditLevelEnum, + GetSqlManageListV2FilterErrorPriorityEnum, GetSqlManageListV2FilterStatusEnum, GetSqlManageListV2FilterPriorityEnum, GetSqlManageListV2SortOrderEnum @@ -205,6 +206,8 @@ export interface IGetSqlManageListV2Params { filter_audit_level?: GetSqlManageListV2FilterAuditLevelEnum; + filter_error_priority?: GetSqlManageListV2FilterErrorPriorityEnum; + filter_last_audit_start_time_from?: string; filter_last_audit_start_time_to?: string; @@ -255,6 +258,8 @@ export interface IGetSqlManageStatisticsV2Params { filter_audit_level?: GetSqlManageListV2FilterAuditLevelEnum; + filter_error_priority?: GetSqlManageListV2FilterErrorPriorityEnum; + filter_last_audit_start_time_from?: string; filter_last_audit_start_time_to?: string; diff --git a/packages/shared/lib/api/sqle/service/SqlManage/index.enum.ts b/packages/shared/lib/api/sqle/service/SqlManage/index.enum.ts index 438f4022a..ff1323666 100644 --- a/packages/shared/lib/api/sqle/service/SqlManage/index.enum.ts +++ b/packages/shared/lib/api/sqle/service/SqlManage/index.enum.ts @@ -102,6 +102,12 @@ export enum GetSqlManageListV2FilterAuditLevelEnum { error = 'error' } +export enum GetSqlManageListV2FilterErrorPriorityEnum { + P0 = 'P0', + + P1 = 'P1' +} + export enum GetSqlManageListV2FilterStatusEnum { unhandled = 'unhandled', diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx index 57ecfba91..9d71667f6 100644 --- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx +++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx @@ -8,7 +8,10 @@ import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/moc import { mockUseProjectBusinessTips } from '@actiontech/shared/lib/testUtil/mockHook/mockUseProjectBusinessTips'; import { useDispatch, useSelector } from 'react-redux'; import { driverMeta } from '../../../../hooks/useDatabaseType/index.test.data'; -import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi'; +import { + createSpySuccessResponse, + createSpyFailResponse +} from '@actiontech/shared/lib/testUtil/mockApi'; import { sqlManageListData } from '../../../../testUtils/mockApi/sqlManage/data'; import { getAllBySelector, @@ -24,6 +27,7 @@ import { mockUseAuditPlanTypes } from '../../../../testUtils/mockRequest'; import { resetRuleTipsCacheForTests } from '../../../../hooks/useRuleTips'; import { GetSqlManageListV2FilterPriorityEnum, + GetSqlManageListV2FilterErrorPriorityEnum, exportSqlManageV1FilterPriorityEnum, exportSqlManageRemediationV1ExportScopeEnum } from '@actiontech/shared/lib/api/sqle/service/SqlManage/index.enum'; @@ -916,4 +920,119 @@ describe('page/SqlManagement/SQLEEIndex', () => { payload: rowWithFirstAudit }); }); + + const selectAuditLevelFilter = async (optionLabel: string) => { + fireEvent.click(screen.getByText('筛选')); + expect(screen.getByText('最低审核等级')).toBeInTheDocument(); + const auditLevelFilterItem = screen + .getByText('最低审核等级') + .closest('.actiontech-table-filter-container-item'); + const auditSelect = + auditLevelFilterItem?.querySelector('.ant-select') ?? + screen.getByText('最低审核等级').closest('.ant-select'); + expect(auditSelect).toBeTruthy(); + fireEvent.mouseDown(auditSelect!.querySelector('.ant-select-selector')!); + await act(async () => jest.advanceTimersByTime(300)); + const option = Array.from( + getAllBySelector('.ant-select-item-option-content') + ).find((el) => el.textContent === optionLabel); + expect(option).toBeTruthy(); + await act(async () => { + fireEvent.click(option!); + await act(async () => jest.advanceTimersByTime(3000)); + }); + await act(async () => jest.advanceTimersByTime(3000)); + }; + + it('should send same filter_error_priority P0 on list and statistics', async () => { + const request = sqlManage.getSqlManageList(); + const statisticsRequest = sqlManage.getSqlManageStatistics(); + superRender(); + await act(async () => jest.advanceTimersByTime(3000)); + await selectAuditLevelFilter('错误(P0)'); + expect(request).toHaveBeenLastCalledWith( + expect.objectContaining({ + filter_audit_level: 'error', + filter_error_priority: GetSqlManageListV2FilterErrorPriorityEnum.P0 + }) + ); + expect(statisticsRequest).toHaveBeenLastCalledWith( + expect.objectContaining({ + filter_audit_level: 'error', + filter_error_priority: GetSqlManageListV2FilterErrorPriorityEnum.P0 + }) + ); + const statsParams = statisticsRequest.mock.calls.at(-1)?.[0] ?? {}; + expect(statsParams).not.toHaveProperty('page_index'); + expect(statsParams).not.toHaveProperty('page_size'); + }); + + it('should send same filter_error_priority P1 on list and statistics', async () => { + const request = sqlManage.getSqlManageList(); + const statisticsRequest = sqlManage.getSqlManageStatistics(); + superRender(); + await act(async () => jest.advanceTimersByTime(3000)); + await selectAuditLevelFilter('错误(P1)'); + expect(request).toHaveBeenLastCalledWith( + expect.objectContaining({ + filter_audit_level: 'error', + filter_error_priority: GetSqlManageListV2FilterErrorPriorityEnum.P1 + }) + ); + expect(statisticsRequest).toHaveBeenLastCalledWith( + expect.objectContaining({ + filter_audit_level: 'error', + filter_error_priority: GetSqlManageListV2FilterErrorPriorityEnum.P1 + }) + ); + }); + + it('should omit filter_error_priority when audit level has no P0/P1', async () => { + const request = sqlManage.getSqlManageList(); + const statisticsRequest = sqlManage.getSqlManageStatistics(); + superRender(); + await act(async () => jest.advanceTimersByTime(3000)); + await selectAuditLevelFilter('告警'); + expect(request).toHaveBeenLastCalledWith( + expect.objectContaining({ + filter_audit_level: 'warn' + }) + ); + expect(request.mock.calls.at(-1)?.[0]).not.toHaveProperty( + 'filter_error_priority' + ); + expect(statisticsRequest).toHaveBeenLastCalledWith( + expect.objectContaining({ + filter_audit_level: 'warn' + }) + ); + expect(statisticsRequest.mock.calls.at(-1)?.[0]).not.toHaveProperty( + 'filter_error_priority' + ); + }); + + it('should keep previous SQL total when statistics fails', async () => { + const statisticsRequest = sqlManage.getSqlManageStatistics(); + statisticsRequest + .mockImplementationOnce(() => + createSpySuccessResponse({ + sql_manage_total_num: 42, + sql_manage_bad_num: 10, + sql_manage_optimized_num: 5 + }) + ) + .mockImplementation(() => + createSpyFailResponse({ + sql_manage_total_num: 0, + sql_manage_bad_num: 0, + sql_manage_optimized_num: 0 + }) + ); + const { baseElement } = superRender(); + await act(async () => jest.advanceTimersByTime(3000)); + expect(baseElement.querySelector('.num.total')).toHaveTextContent('42'); + fireEvent.click(screen.getByText('已解决')); + await act(async () => jest.advanceTimersByTime(3000)); + expect(baseElement.querySelector('.num.total')).toHaveTextContent('42'); + }); }); diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx index a320ab682..0c073dd1d 100644 --- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx +++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx @@ -434,7 +434,7 @@ const SQLEEIndex = () => { : undefined, filter_parse_failed: isParseFailedRuleSelected ? true : undefined, extra_filters: buildExtraFiltersForRequest(tableFilterInfo) - }) as IGetSqlManageListV2Params & { filter_error_priority?: string }; + }) as IGetSqlManageListV2Params; return params; // eslint-disable-next-line react-hooks/exhaustive-deps @@ -860,18 +860,10 @@ const SQLEEIndex = () => { filter_schema_name: listParams.filter_schema_name, filter_parse_failed: listParams.filter_parse_failed, extra_filters: listParams.extra_filters, - // S3 §8.4:导出复用列表筛选(含 error priority);swagger 未再生前交叉扩展 - ...(( - listParams as IGetSqlManageListV2Params & { - filter_error_priority?: string; - } - ).filter_error_priority + // 导出 swagger 尚未声明 filter_error_priority;列表类型已含该字段,仅向导出参透传 + ...(listParams.filter_error_priority ? { - filter_error_priority: ( - listParams as IGetSqlManageListV2Params & { - filter_error_priority?: string; - } - ).filter_error_priority + filter_error_priority: listParams.filter_error_priority } : {}) } as Parameters[0],