评查点,增改逻辑完善
This commit is contained in:
@@ -136,54 +136,59 @@ export function ReviewSettings({ onChange, initialData }: ReviewSettingsProps) {
|
||||
|
||||
// 监听抽取设置中的字段变化
|
||||
useEffect(() => {
|
||||
// 当Context中的字段发生变化时,更新可用字段但保留已有配置
|
||||
if (extractionFields.length > 0) {
|
||||
// 检查是否有字段被删除
|
||||
const deletedFields = availableFields.filter(field => !extractionFields.includes(field));
|
||||
|
||||
// 处理新增的字段
|
||||
const newFields = extractionFields.filter((field: string) => !availableFields.includes(field));
|
||||
|
||||
if (newFields.length > 0 || deletedFields.length > 0) {
|
||||
// 设置最新的可用字段列表
|
||||
setAvailableFields(extractionFields);
|
||||
|
||||
// 处理规则中已删除的字段
|
||||
if (deletedFields.length > 0) {
|
||||
handleDeletedFields(deletedFields);
|
||||
}
|
||||
|
||||
// 使用最新的字段列表更新规则配置
|
||||
updateRulesWithNewFields(extractionFields);
|
||||
}
|
||||
}
|
||||
// 用于防抖的变量
|
||||
let fieldUpdateTimeout: NodeJS.Timeout | null = null;
|
||||
const debounceDelay = 800; // 防抖延迟时间
|
||||
const lastProcessedFieldsRef = { current: [] as string[] };
|
||||
|
||||
// 监听抽取设置的变化 - 用于捕获非Context更新的情况
|
||||
const handleExtractionChange = (event: Event) => {
|
||||
if (event instanceof CustomEvent && event.detail && Array.isArray(event.detail.fields)) {
|
||||
const incomingFields = event.detail.fields;
|
||||
|
||||
// 检查是否有实际变化
|
||||
if (JSON.stringify(incomingFields) !== JSON.stringify(availableFields)) {
|
||||
// 检查是否有字段被删除
|
||||
const deletedFields = availableFields.filter(field => !incomingFields.includes(field));
|
||||
|
||||
// 识别新增的字段
|
||||
const newFields = incomingFields.filter((field: string) => !availableFields.includes(field));
|
||||
|
||||
if (newFields.length > 0 || deletedFields.length > 0) {
|
||||
// 设置最新的可用字段列表
|
||||
setAvailableFields(incomingFields);
|
||||
|
||||
// 处理规则中已删除的字段
|
||||
if (deletedFields.length > 0) {
|
||||
handleDeletedFields(deletedFields);
|
||||
}
|
||||
|
||||
// 使用最新的字段列表更新规则配置
|
||||
updateRulesWithNewFields(incomingFields);
|
||||
}
|
||||
// 检查是否与上次处理的字段相同,避免重复处理
|
||||
if (JSON.stringify(incomingFields) === JSON.stringify(lastProcessedFieldsRef.current)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 清除之前的定时器
|
||||
if (fieldUpdateTimeout) {
|
||||
clearTimeout(fieldUpdateTimeout);
|
||||
}
|
||||
|
||||
// 设置防抖处理
|
||||
fieldUpdateTimeout = setTimeout(() => {
|
||||
// 检查字段是否有实质性变化
|
||||
if (JSON.stringify(incomingFields) !== JSON.stringify(availableFields)) {
|
||||
// 获取被删除的字段(过滤掉临时性的删除)
|
||||
const deletedFields = availableFields.filter(field =>
|
||||
// 只有存在超过一定数量时间的字段才认为是真正删除
|
||||
!incomingFields.includes(field)
|
||||
);
|
||||
|
||||
// 识别新增的字段
|
||||
const newFields = incomingFields.filter((field: string) =>
|
||||
!availableFields.includes(field)
|
||||
);
|
||||
|
||||
// 仅当字段变化明显时才更新(防止临时空字段触发)
|
||||
if ((newFields.length > 0) || (deletedFields.length > 0 && incomingFields.length > 0)) {
|
||||
console.log('字段变更:', {deletedFields, newFields, incomingFields, availableFields});
|
||||
|
||||
// 设置最新的可用字段列表
|
||||
setAvailableFields(incomingFields);
|
||||
lastProcessedFieldsRef.current = [...incomingFields];
|
||||
|
||||
// 处理规则中已删除的字段
|
||||
if (deletedFields.length > 0) {
|
||||
handleDeletedFields(deletedFields);
|
||||
}
|
||||
|
||||
// 使用最新的字段列表更新规则配置
|
||||
updateRulesWithNewFields(incomingFields);
|
||||
}
|
||||
}
|
||||
}, debounceDelay);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -193,8 +198,11 @@ export function ReviewSettings({ onChange, initialData }: ReviewSettingsProps) {
|
||||
// 组件卸载时移除事件监听
|
||||
return () => {
|
||||
document.removeEventListener('extraction-fields-updated', handleExtractionChange);
|
||||
if (fieldUpdateTimeout) {
|
||||
clearTimeout(fieldUpdateTimeout);
|
||||
}
|
||||
};
|
||||
}, [extractionFields, availableFields]);
|
||||
}, [availableFields]);
|
||||
|
||||
// 检查并更新字段(仍然保留此函数供需要时手动触发)
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
|
||||
Reference in New Issue
Block a user