feat(phase7): add batch classification modes
This commit is contained in:
@@ -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="选择素材库"
|
||||
|
||||
Reference in New Issue
Block a user