fix: align rules list and review detail flows

This commit is contained in:
wren
2026-05-06 10:35:57 +08:00
parent 99fce169cb
commit 22ef99754c
9 changed files with 257 additions and 172 deletions
+30 -13
View File
@@ -61,6 +61,16 @@ function unique(values: string[]): string[] {
return Array.from(new Set(values.filter(Boolean)));
}
function resolveDocumentScope(pack: Pick<RuleYamlPack, 'documentType' | 'mainType' | 'moduleType'>): string {
const values = [pack.documentType, pack.mainType, pack.moduleType].join(' ');
if (values.includes('合同')) return '合同';
if (values.includes('案卷') || values.includes('卷宗') || values.includes('行政处罚') || values.includes('行政许可')) {
return '案卷';
}
if (values.includes('公文')) return '内部公文';
return pack.documentType || pack.mainType || pack.moduleType || '未分类';
}
function riskColor(risk: string): TagColor {
if (risk === 'high') return 'red';
if (risk === 'medium') return 'orange';
@@ -86,28 +96,36 @@ export async function loader({ request }: LoaderFunctionArgs) {
};
const packs = await loadRuleConfigPacks(request);
const documentTypes = unique(packs.map(pack => pack.documentType));
const inferredDocumentType = packs.find(pack => pack.mainType === requestedFilters.mainType)?.documentType || '';
const currentDocumentType = documentTypes.includes(requestedFilters.documentType)
? requestedFilters.documentType
const packScopes = packs.map(pack => ({
pack,
scope: resolveDocumentScope(pack),
}));
const documentTypes = unique(packScopes.map(item => item.scope));
const requestedDocumentType = requestedFilters.documentType;
const inferredDocumentType = requestedMainType
? packScopes.find(item => item.pack.mainType === requestedMainType)?.scope || ''
: '';
const currentDocumentType = documentTypes.includes(requestedDocumentType)
? requestedDocumentType
: inferredDocumentType || documentTypes[0] || '';
const scopedDocumentPacks = packScopes
.filter(item => item.scope === currentDocumentType)
.map(item => item.pack);
const scopedFilters = {
...requestedFilters,
documentType: currentDocumentType,
mainType: packs.some(pack => pack.documentType === currentDocumentType && pack.mainType === requestedFilters.mainType)
mainType: scopedDocumentPacks.some(pack => pack.mainType === requestedFilters.mainType)
? requestedFilters.mainType
: '',
subtype: packs.some(pack =>
pack.documentType === currentDocumentType &&
subtype: scopedDocumentPacks.some(pack =>
(!requestedFilters.mainType || pack.mainType === requestedFilters.mainType) &&
pack.subtype === requestedFilters.subtype
)
? requestedFilters.subtype
: ''
};
const scopedByMainTypePacks = packs.filter(pack =>
pack.documentType === scopedFilters.documentType &&
(!scopedFilters.mainType || pack.mainType === scopedFilters.mainType)
const scopedByMainTypePacks = scopedDocumentPacks.filter(pack =>
!scopedFilters.mainType || pack.mainType === scopedFilters.mainType
);
const subtypeOptions = unique(scopedByMainTypePacks.map(pack => pack.subtype));
const ruleGroupSourcePacks = scopedFilters.subtype
@@ -122,8 +140,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
...scopedFilters,
ruleGroup: ruleGroupOptions.includes(requestedFilters.ruleGroup) ? requestedFilters.ruleGroup : ''
};
const visiblePacks = packs.filter(pack =>
pack.documentType === filters.documentType &&
const visiblePacks = scopedDocumentPacks.filter(pack =>
(!filters.mainType || pack.mainType === filters.mainType) &&
(!filters.subtype || pack.subtype === filters.subtype)
);
@@ -196,7 +213,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
pageSize: filters.pageSize,
options: {
documentTypes,
mainTypes: unique(packs.filter(pack => pack.documentType === filters.documentType).map(pack => pack.mainType)),
mainTypes: unique(scopedDocumentPacks.map(pack => pack.mainType)),
subtypes: subtypeOptions,
ruleGroups: ruleGroupOptions
}