Skip to content

Commit 7da53f3

Browse files
committed
fix:增加AI状态检查功能
1 parent c7c76d2 commit 7da53f3

File tree

3 files changed

+113
-1
lines changed
  • src
    • common/network
    • component/SensitiveColumnIndicator
    • page/Project/Sensitive/components/SensitiveColumn/components

3 files changed

+113
-1
lines changed

src/common/network/ai.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2025 OceanBase
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
import request from '@/util/request';
18+
19+
/**
20+
* AI功能状态响应接口
21+
*/
22+
export interface IAIStatusResponse {
23+
/** AI功能是否启用 */
24+
enabled: boolean;
25+
/** AI功能是否可用 */
26+
available: boolean;
27+
/** 使用的AI模型 */
28+
model: string;
29+
/** API基础URL */
30+
baseUrl: string;
31+
/** API密钥是否已配置 */
32+
apiKeyConfigured: boolean;
33+
}
34+
35+
/**
36+
* 查询AI功能状态
37+
* @returns AI功能状态信息
38+
*/
39+
export async function getAIStatus(): Promise<IAIStatusResponse> {
40+
const res = await request.get('/api/v2/ai/status');
41+
return res?.data;
42+
}
43+
44+
/**
45+
* 检查AI功能是否可用
46+
* @returns 是否可用
47+
*/
48+
export async function isAIAvailable(): Promise<boolean> {
49+
try {
50+
const status = await getAIStatus();
51+
return status.enabled && status.available;
52+
} catch (error) {
53+
console.warn('Failed to check AI status:', error);
54+
return false;
55+
}
56+
}

src/component/SensitiveColumnIndicator/index.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { EyeInvisibleOutlined, SecurityScanOutlined, SyncOutlined } from '@ant-d
88
import { formatMessage } from '@/util/intl';
99
import sensitiveColumnScanner, { IScanResult } from '@/service/sensitiveColumnScanner';
1010
import { ISensitiveColumnInfo } from '@/d.ts/sensitiveColumn';
11+
import { isAIAvailable } from '@/common/network/ai';
1112
import styles from './index.less';
1213

1314
interface ISensitiveColumnIndicatorProps {
@@ -72,6 +73,21 @@ const SensitiveColumnIndicator: React.FC<ISensitiveColumnIndicatorProps> = ({
7273
const [scanError, setScanError] = useState<string | null>(null);
7374
const [retryCount, setRetryCount] = useState(0);
7475
const [isRetrying, setIsRetrying] = useState(false);
76+
const [aiAvailable, setAiAvailable] = useState<boolean>(true);
77+
78+
// 检查AI功能状态
79+
useEffect(() => {
80+
const checkAIStatus = async () => {
81+
try {
82+
const available = await isAIAvailable();
83+
setAiAvailable(available);
84+
} catch (error) {
85+
console.warn('检查AI状态失败:', error);
86+
setAiAvailable(false);
87+
}
88+
};
89+
checkAIStatus();
90+
}, []);
7591

7692
// 使用传入的敏感列数据或扫描结果
7793
const sensitiveColumns = propSensitiveColumns || scanResult?.sensitiveColumns || [];
@@ -199,6 +215,15 @@ const SensitiveColumnIndicator: React.FC<ISensitiveColumnIndicatorProps> = ({
199215
sensitiveColumnScanner.removeCacheChangeListener(handleCacheChange);
200216
};
201217
}, [tableName, databaseName, sessionId, autoScan, propSensitiveColumns]);
218+
219+
// 如果外部已提供敏感列数据,直接显示,不受AI状态影响
220+
if (propSensitiveColumns && propSensitiveColumns.length > 0) {
221+
// 外部提供的数据,直接渲染,跳过AI状态检查
222+
} else if (!aiAvailable) {
223+
// 只有在需要扫描且AI未开启时才隐藏组件
224+
return null;
225+
}
226+
202227
// 如果正在扫描,显示扫描状态
203228
if (isScanning) {
204229
return (

src/page/Project/Sensitive/components/SensitiveColumn/components/SacnRule.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { useContext, useEffect, useState } from 'react';
3030
import SensitiveContext from '../../../SensitiveContext';
3131
import MultipleDatabaseSelect from '@/component/Task/component/MultipleDatabaseSelect/index';
3232
import { isConnectTypeBeFileSystemGroup } from '@/util/connection';
33+
import { isAIAvailable } from '@/common/network/ai';
3334

3435
const ScanRule = ({ formRef, reset, setManageSensitiveRuleDrawerOpen }) => {
3536
const context = useContext(ProjectContext);
@@ -42,6 +43,35 @@ const ScanRule = ({ formRef, reset, setManageSensitiveRuleDrawerOpen }) => {
4243
const [dataSourceOptions, setDataSourceOptions] = useState<SelectItemProps[]>([]);
4344
const [sensitiveOptions, setSensitiveOptions] = useState<SelectItemProps[]>([]);
4445
const [rawData, setRawData] = useState<IResponseData<IConnection>>();
46+
const [aiAvailable, setAiAvailable] = useState<boolean>(true);
47+
// 检查AI功能状态
48+
useEffect(() => {
49+
const checkAIStatus = async () => {
50+
try {
51+
const available = await isAIAvailable();
52+
setAiAvailable(available);
53+
54+
// 如果AI不可用且当前选择的是AI增强识别,自动切换到传统规则识别
55+
if (!available && scanningMode === 'JOINT_RECOGNITION') {
56+
await formRef.setFieldsValue({
57+
scanningMode: 'RULES_ONLY',
58+
});
59+
}
60+
} catch (error) {
61+
console.warn('检查AI状态失败:', error);
62+
setAiAvailable(false);
63+
64+
// AI检查失败时也切换到传统规则识别
65+
if (scanningMode === 'JOINT_RECOGNITION') {
66+
await formRef.setFieldsValue({
67+
scanningMode: 'RULES_ONLY',
68+
});
69+
}
70+
}
71+
};
72+
checkAIStatus();
73+
}, []);
74+
4575
const initDataSources = async () => {
4676
const rawData = await getConnectionList({
4777
projectId: sensitiveContext.projectId,
@@ -283,11 +313,12 @@ const ScanRule = ({ formRef, reset, setManageSensitiveRuleDrawerOpen }) => {
283313
defaultMessage: '传统规则识别',
284314
})}
285315
</Radio>
286-
<Radio value="JOINT_RECOGNITION">
316+
<Radio value="JOINT_RECOGNITION" disabled={!aiAvailable}>
287317
{formatMessage({
288318
id: 'odc.SensitiveColumn.components.SacnRule.AIEnhanced',
289319
defaultMessage: 'AI增强识别',
290320
})}
321+
{!aiAvailable && <span style={{ color: '#999', marginLeft: 8 }}>(AI功能未开启)</span>}
291322
</Radio>
292323
</Radio.Group>
293324
</Form.Item>

0 commit comments

Comments
 (0)