feat(phase7): add batch classification modes

This commit is contained in:
Xiaoxia AI
2026-06-17 19:39:04 +08:00
parent 384d29cc76
commit ac70a01f50
+26 -28
View File
@@ -47,6 +47,11 @@ const classificationOptions = [
{ label: 'other', value: 'other' },
];
const batchModeOptions = [
{ label: '仅未分类', value: 'unclassified_only' },
{ label: '包含已分类重跑', value: 'include_classified' },
];
const ProjectAssets: React.FC = () => {
const { id } = useParams<{ id: string }>();
const projectId = id || '';
@@ -59,6 +64,7 @@ const ProjectAssets: React.FC = () => {
const [classifyingAssetId, setClassifyingAssetId] = useState<string>('');
const [classificationFilter, setClassificationFilter] = useState<string>('all');
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
const [batchMode, setBatchMode] = useState<'unclassified_only' | 'include_classified'>('unclassified_only');
const [batchProgress, setBatchProgress] = useState({ total: 0, submitted: 0, failed: 0, skipped: 0, running: false });
const [form] = Form.useForm();
@@ -174,25 +180,28 @@ const ProjectAssets: React.FC = () => {
return;
}
const skippedAssets = selectedAssets.filter(
(item) => item.metadata?.auto_classification === 'queued' || classifyingAssetId === item.id
);
const runnableAssets = selectedAssets.filter(
(item) => item.metadata?.auto_classification !== 'queued' && classifyingAssetId !== item.id
);
const skippedAssets = selectedAssets.filter((item) => {
const busy = item.metadata?.auto_classification === 'queued' || classifyingAssetId === item.id;
const alreadyClassified = !!item.metadata?.classification;
if (busy) return true;
if (batchMode === 'unclassified_only' && alreadyClassified) return true;
return false;
});
const runnableAssets = selectedAssets.filter((item) => {
const busy = item.metadata?.auto_classification === 'queued' || classifyingAssetId === item.id;
const alreadyClassified = !!item.metadata?.classification;
if (busy) return false;
if (batchMode === 'unclassified_only' && alreadyClassified) return false;
return true;
});
if (!runnableAssets.length) {
message.warning('选中的素材都处于分类中,无法重复提交');
message.warning('当前策略下没有可提交的素材');
return;
}
setBatchProgress({
total: selectedAssets.length,
submitted: 0,
failed: 0,
skipped: skippedAssets.length,
running: true,
});
setBatchProgress({ total: selectedAssets.length, submitted: 0, failed: 0, skipped: skippedAssets.length, running: true });
let submitted = 0;
let failed = 0;
@@ -208,22 +217,10 @@ const ProjectAssets: React.FC = () => {
} catch {
failed += 1;
}
setBatchProgress({
total: selectedAssets.length,
submitted,
failed,
skipped: skippedAssets.length,
running: true,
});
setBatchProgress({ total: selectedAssets.length, submitted, failed, skipped: skippedAssets.length, running: true });
}
setBatchProgress({
total: selectedAssets.length,
submitted,
failed,
skipped: skippedAssets.length,
running: false,
});
setBatchProgress({ total: selectedAssets.length, submitted, failed, skipped: skippedAssets.length, running: false });
if (failed === 0) {
message.success(`批量分类已提交:成功 ${submitted},跳过 ${skippedAssets.length}`);
@@ -324,6 +321,7 @@ const ProjectAssets: React.FC = () => {
extra={
<Space>
<Select style={{ width: 180 }} value={classificationFilter} options={classificationOptions} onChange={setClassificationFilter} />
<Select style={{ width: 180 }} value={batchMode} options={batchModeOptions} onChange={setBatchMode} />
<Select
style={{ width: 280 }}
placeholder="选择素材库"