fix: restore rule detail dependencies

This commit is contained in:
wren
2026-05-07 18:31:25 +08:00
parent add399e126
commit 5fc3a7a254
2 changed files with 67 additions and 15 deletions
+38 -10
View File
@@ -185,6 +185,28 @@ function fallbackDependencyOption(value: string, optionMap?: Map<string, Depende
};
}
function resolveRuleDependencies(
rule: RuleSummary | undefined,
rulesById: Map<string, RuleSummary>,
visited = new Set<string>(),
): string[] {
if (!rule) return [];
const key = rule.ruleId || rule.id;
if (visited.has(key)) return [];
visited.add(key);
const merged = new Set<string>((rule.dependencies || []).filter(Boolean));
(rule.subRuleIds || []).forEach((ruleId) => {
const referenced = rulesById.get(ruleId);
resolveRuleDependencies(referenced, rulesById, visited).forEach((dependency) => {
if (dependency) merged.add(dependency);
});
});
return Array.from(merged);
}
function makeId(prefix: string): string {
return `${prefix}-${Date.now()}`;
}
@@ -571,29 +593,36 @@ export default function RulesTestDetail() {
'ai_rule',
'rule_group'
]), [rules]);
const rulesById = useMemo(() => new Map(rules.map(rule => [rule.ruleId || rule.id, rule])), [rules]);
const selectedDependencyOptions = useMemo(() => {
return ruleDraft.dependencies.map(value => dependencyOptionMap.get(value) || fallbackDependencyOption(value, dependencyOptionMap));
}, [dependencyOptionMap, ruleDraft.dependencies]);
const resolvedCurrentDependencies = useMemo(() => {
return resolveRuleDependencies(currentRule, rulesById);
}, [currentRule, rulesById]);
const currentRuleWithResolvedDependencies = useMemo(() => (
currentRule ? { ...currentRule, dependencies: resolvedCurrentDependencies } : undefined
), [currentRule, resolvedCurrentDependencies]);
const currentDependencyRows = useMemo(() => {
return (currentRule?.dependencies || []).map(value => dependencyOptionMap.get(value) || fallbackDependencyOption(value, dependencyOptionMap));
}, [currentRule, dependencyOptionMap]);
return resolvedCurrentDependencies.map(value => dependencyOptionMap.get(value) || fallbackDependencyOption(value, dependencyOptionMap));
}, [dependencyOptionMap, resolvedCurrentDependencies]);
const currentRuleFields = useMemo(
() => fields.filter((field) => matchesCurrentRuleDependency(currentRule, [field.name])),
[currentRule, fields],
() => fields.filter((field) => matchesCurrentRuleDependency(currentRuleWithResolvedDependencies, [field.name])),
[currentRuleWithResolvedDependencies, fields],
);
const currentRuleSubDocuments = useMemo(
() => subDocuments.filter((document) => matchesCurrentRuleDependency(currentRule, [document.name, document.id])),
[currentRule, subDocuments],
() => subDocuments.filter((document) => matchesCurrentRuleDependency(currentRuleWithResolvedDependencies, [document.name, document.id])),
[currentRuleWithResolvedDependencies, subDocuments],
);
const currentRuleVisualElements = useMemo(
() => visualElements.filter((item) => matchesCurrentRuleDependency(currentRule, [
() => visualElements.filter((item) => matchesCurrentRuleDependency(currentRuleWithResolvedDependencies, [
item.id,
item.name,
`visual.${item.id}`,
`visual.${item.name || item.id}`,
item.type,
])),
[currentRule, visualElements],
[currentRuleWithResolvedDependencies, visualElements],
);
const dialogDependencyOptions = useMemo(() => {
const selectedValues = new Set(ruleDraft.dependencies);
@@ -644,7 +673,6 @@ export default function RulesTestDetail() {
const fullYamlText = serializedYamlResult.yamlText;
const isSmartRuleDraft = ruleDraft.type === 'ai_rule' || ruleDraft.checkTypes.includes('ai');
const isRuleGroupDraft = ruleDraft.type === 'rule_group';
const rulesById = useMemo(() => new Map(rules.map(rule => [rule.ruleId || rule.id, rule])), [rules]);
const saveButtonBusy = saveFetcher.state !== 'idle';
const latestDraftVersion = useMemo(
() => versionItems.find((item) => !['published', 'rollback'].includes(item.status)),
@@ -1362,7 +1390,7 @@ export default function RulesTestDetail() {
<Card
className="ant-card"
title={`依赖字段 (${currentRule.dependencies.length}项)`}
title={`依赖字段 (${resolvedCurrentDependencies.length}项)`}
>
<Table
className="rules-test-table"