@@ -6,7 +6,8 @@ import { useEffect, useState, useRef } from "react";
66import {
77 createAnnotationTaskUsingPost ,
88 queryAnnotationTemplatesUsingGet ,
9- createAutoAnnotationTaskUsingPost ,
9+ // 自动标注创建API已屏蔽(保留代码在注释中)
10+ // createAutoAnnotationTaskUsingPost,
1011} from "../../annotation.api" ;
1112import DatasetFileTransfer from "@/components/business/DatasetFileTransfer" ;
1213import { DatasetType , type Dataset , type DatasetFile } from "@/pages/DataManagement/dataset.model" ;
@@ -329,65 +330,54 @@ export default function CreateAnnotationTask({
329330 }
330331 } ;
331332
332- const handleAutoSubmit = async ( ) => {
333- try {
334- const values = await autoForm . validateFields ( ) ;
335-
336- if ( imageFileCount === 0 ) {
337- message . error ( t ( 'dataAnnotation.create.messages.selectAtLeastOneImageFile' ) ) ;
338- return ;
339- }
340-
341- setSubmitting ( true ) ;
342-
343- const selectedFiles = Object . values ( selectedFilesMap ) as any [ ] ;
344-
345- // 对于自动标注,后端会根据 fileIds 自动按数据集分组并为每个数据集创建/复用 LS 项目,
346- // 这里不再强制限制只能选择单一数据集,只需保证至少有一个 datasetId,
347- // 否则退回到表单中的 datasetId。
348- const datasetIds = Array . from (
349- new Set (
350- selectedFiles
351- . map ( ( file ) => file ?. datasetId )
352- . filter ( ( id ) => id !== undefined && id !== null && id !== "" ) ,
353- ) ,
354- ) ;
355-
356- const effectiveDatasetId = values . datasetId || datasetIds [ 0 ] ;
357-
358- const imageExtensions = [ ".jpg" , ".jpeg" , ".png" , ".bmp" , ".gif" , ".tiff" , ".webp" ] ;
359- const imageFileIds = Object . values ( selectedFilesMap )
360- . filter ( ( file ) => {
361- const ext = file . fileName ?. toLowerCase ( ) . match ( / \. [ ^ . ] + $ / ) ?. [ 0 ] || "" ;
362- return imageExtensions . includes ( ext ) ;
363- } )
364- . map ( ( file ) => file . id ) ;
365-
366- const payload = {
367- name : values . name ,
368- datasetId : effectiveDatasetId ,
369- fileIds : imageFileIds ,
370- config : {
371- modelSize : values . modelSize ,
372- confThreshold : values . confThreshold ,
373- targetClasses : selectAllClasses ? [ ] : values . targetClasses || [ ] ,
374- } ,
375- } ;
376-
377- await createAutoAnnotationTaskUsingPost ( payload ) ;
378- message . success ( t ( 'dataAnnotation.create.messages.autoCreateSuccess' ) ) ;
379- setShouldResetOnOpen ( true ) ; // 标记下次打开时需要重置
380- // 触发上层刷新自动标注任务列表
381- ( onRefresh as any ) ?.( "auto" ) ;
382- onClose ( ) ;
383- } catch ( error : any ) {
384- if ( error . errorFields ) return ;
385- console . error ( "Failed to create auto annotation task:" , error ) ;
386- message . error ( error . message || t ( 'dataAnnotation.create.messages.autoCreateFailed' ) ) ;
387- } finally {
388- setSubmitting ( false ) ;
389- }
390- } ;
333+ // 自动标注提交函数已屏蔽(保留代码在注释中)
334+ // const handleAutoSubmit = async () => {
335+ // try {
336+ // const values = await autoForm.validateFields();
337+ // if (imageFileCount === 0) {
338+ // message.error(t('dataAnnotation.create.messages.selectAtLeastOneImageFile'));
339+ // return;
340+ // }
341+ // setSubmitting(true);
342+ // const selectedFiles = Object.values(selectedFilesMap) as any[];
343+ // const datasetIds = Array.from(
344+ // new Set(
345+ // selectedFiles
346+ // .map((file) => file?.datasetId)
347+ // .filter((id) => id !== undefined && id !== null && id !== ""),
348+ // ),
349+ // );
350+ // const effectiveDatasetId = values.datasetId || datasetIds[0];
351+ // const imageExtensions = [".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp"];
352+ // const imageFileIds = Object.values(selectedFilesMap)
353+ // .filter((file) => {
354+ // const ext = file.fileName?.toLowerCase().match(/\.[^.]+$/)?.[0] || "";
355+ // return imageExtensions.includes(ext);
356+ // })
357+ // .map((file) => file.id);
358+ // const payload = {
359+ // name: values.name,
360+ // datasetId: effectiveDatasetId,
361+ // fileIds: imageFileIds,
362+ // config: {
363+ // modelSize: values.modelSize,
364+ // confThreshold: values.confThreshold,
365+ // targetClasses: selectAllClasses ? [] : values.targetClasses || [],
366+ // },
367+ // };
368+ // await createAutoAnnotationTaskUsingPost(payload);
369+ // message.success(t('dataAnnotation.create.messages.autoCreateSuccess'));
370+ // setShouldResetOnOpen(true);
371+ // (onRefresh as any)?.("auto");
372+ // onClose();
373+ // } catch (error: any) {
374+ // if (error.errorFields) return;
375+ // console.error("Failed to create auto annotation task:", error);
376+ // message.error(error.message || t('dataAnnotation.create.messages.autoCreateFailed'));
377+ // } finally {
378+ // setSubmitting(false);
379+ // }
380+ // };
391381
392382 const handleClassSelectionChange = ( checked : boolean ) => {
393383 setSelectAllClasses ( checked ) ;
@@ -408,7 +398,7 @@ export default function CreateAnnotationTask({
408398 </ Button >
409399 < Button
410400 type = "primary"
411- onClick = { activeMode === "manual" ? handleManualSubmit : handleAutoSubmit }
401+ onClick = { handleManualSubmit }
412402 loading = { submitting }
413403 >
414404 { t ( 'dataAnnotation.create.ok' ) }
@@ -417,6 +407,7 @@ export default function CreateAnnotationTask({
417407 }
418408 width = { 800 }
419409 >
410+ { /* 自动标注功能已屏蔽 - Tabs 结构保留但仅显示手动标注 */ }
420411 < Tabs
421412 activeKey = { activeMode }
422413 onChange = { ( key ) => setActiveMode ( key as "manual" | "auto" ) }
@@ -548,102 +539,103 @@ export default function CreateAnnotationTask({
548539 </ Form >
549540 ) ,
550541 } ,
551- {
552- key : "auto" ,
553- label : t ( 'dataAnnotation.create.auto' ) ,
554- children : (
555- < Form form = { autoForm } layout = "vertical" preserve = { false } >
556- { /* 自动标注:任务名称仍然放在第一行,必填 */ }
557- < Form . Item
558- name = "name"
559- label = { t ( 'dataAnnotation.create.form.name' ) }
560- rules = { [
561- { required : true , message : t ( 'dataAnnotation.create.form.nameRequired' ) } ,
562- { max : 100 , message : t ( 'dataAnnotation.create.form.nameMaxLength' ) } ,
563- ] }
564- >
565- < Input placeholder = { t ( 'dataAnnotation.create.form.namePlaceholder' ) } />
566- </ Form . Item >
567-
568- < Form . Item label = { t ( 'dataAnnotation.create.form.selectDatasetAndFiles' ) } required >
569- < DatasetFileTransfer
570- open
571- selectedFilesMap = { selectedFilesMap }
572- onSelectedFilesChange = { setSelectedFilesMap }
573- onDatasetSelect = { ( dataset ) => {
574- setSelectedDataset ( dataset as Dataset | null ) ;
575- autoForm . setFieldsValue ( { datasetId : dataset ?. id ?? "" } ) ;
576- } }
577- datasetTypeFilter = { DatasetType . IMAGE }
578- allowedFileExtensions = { IMAGE_EXTENSIONS }
579- singleDatasetOnly
580- />
581- { selectedDataset && (
582- < div className = "mt-2 p-2 bg-blue-50 rounded border border-blue-200 text-xs" >
583- { t ( 'dataAnnotation.create.form.currentDataset' , { name : selectedDataset . name , count : imageFileCount } ) }
584- </ div >
585- ) }
586- </ Form . Item >
587-
588- < Form . Item
589- hidden
590- name = "datasetId"
591- rules = { [ { required : true , message : t ( 'dataAnnotation.create.form.datasetRequired' ) } ] }
592- >
593- < Input type = "hidden" />
594- </ Form . Item >
595-
596- < Form . Item
597- name = "modelSize"
598- label = { t ( 'dataAnnotation.create.form.modelSize' ) }
599- rules = { [ { required : true , message : t ( 'dataAnnotation.create.form.modelSizeRequired' ) } ] }
600- initialValue = "l"
601- >
602- < Select >
603- < Option value = "n" > { t ( 'dataAnnotation.home.autoModelSizeLabels.n' ) } </ Option >
604- < Option value = "s" > { t ( 'dataAnnotation.home.autoModelSizeLabels.s' ) } </ Option >
605- < Option value = "m" > { t ( 'dataAnnotation.home.autoModelSizeLabels.m' ) } </ Option >
606- < Option value = "l" > { t ( 'dataAnnotation.home.autoModelSizeLabels.l' ) } </ Option >
607- < Option value = "x" > { t ( 'dataAnnotation.home.autoModelSizeLabels.x' ) } </ Option >
608- </ Select >
609- </ Form . Item >
610-
611- < Form . Item
612- name = "confThreshold"
613- label = { t ( 'dataAnnotation.create.form.confThreshold' ) }
614- rules = { [ { required : true , message : t ( 'dataAnnotation.create.form.confThresholdRequired' ) } ] }
615- initialValue = { 0.7 }
616- >
617- < Slider
618- min = { 0.1 }
619- max = { 0.9 }
620- step = { 0.05 }
621- tooltip = { { formatter : ( v ) => `${ ( v || 0 ) * 100 } %` } }
622- />
623- </ Form . Item >
624-
625- < Form . Item label = { t ( 'dataAnnotation.create.form.targetClasses' ) } >
626- < Checkbox
627- checked = { selectAllClasses }
628- onChange = { ( e ) => handleClassSelectionChange ( e . target . checked ) }
629- >
630- { t ( 'dataAnnotation.create.form.selectAllClasses' ) }
631- </ Checkbox >
632- { ! selectAllClasses && (
633- < Form . Item name = "targetClasses" noStyle >
634- < Select mode = "multiple" placeholder = { t ( 'dataAnnotation.create.form.selectTargetClasses' ) } style = { { marginTop : 8 } } >
635- { COCO_CLASSES . map ( ( cls ) => (
636- < Option key = { cls . id } value = { cls . id } >
637- { cls . label } ({ cls . name } )
638- </ Option >
639- ) ) }
640- </ Select >
641- </ Form . Item >
642- ) }
643- </ Form . Item >
644- </ Form >
645- ) ,
646- } ,
542+ // 自动标注 Tab 已屏蔽(代码保留在下方注释中,需要恢复时可取消注释)
543+ // {
544+ // key: "auto",
545+ // label: t('dataAnnotation.create.auto'),
546+ // children: (
547+ // <Form form={autoForm} layout="vertical" preserve={false}>
548+ // {/* 自动标注:任务名称仍然放在第一行,必填 */}
549+ // <Form.Item
550+ // name="name"
551+ // label={t('dataAnnotation.create.form.name')}
552+ // rules={[
553+ // { required: true, message: t('dataAnnotation.create.form.nameRequired') },
554+ // { max: 100, message: t('dataAnnotation.create.form.nameMaxLength') },
555+ // ]}
556+ // >
557+ // <Input placeholder={t('dataAnnotation.create.form.namePlaceholder')} />
558+ // </Form.Item>
559+ //
560+ // <Form.Item label={t('dataAnnotation.create.form.selectDatasetAndFiles')} required>
561+ // <DatasetFileTransfer
562+ // open
563+ // selectedFilesMap={selectedFilesMap}
564+ // onSelectedFilesChange={setSelectedFilesMap}
565+ // onDatasetSelect={(dataset) => {
566+ // setSelectedDataset(dataset as Dataset | null);
567+ // autoForm.setFieldsValue({ datasetId: dataset?.id ?? "" });
568+ // }}
569+ // datasetTypeFilter={DatasetType.IMAGE}
570+ // allowedFileExtensions={IMAGE_EXTENSIONS}
571+ // singleDatasetOnly
572+ // />
573+ // {selectedDataset && (
574+ // <div className="mt-2 p-2 bg-blue-50 rounded border border-blue-200 text-xs">
575+ // {t('dataAnnotation.create.form.currentDataset', { name: selectedDataset.name, count: imageFileCount }) }
576+ // </div>
577+ // )}
578+ // </Form.Item>
579+ //
580+ // <Form.Item
581+ // hidden
582+ // name="datasetId"
583+ // rules={[{ required: true, message: t('dataAnnotation.create.form.datasetRequired') }]}
584+ // >
585+ // <Input type="hidden" />
586+ // </Form.Item>
587+ //
588+ // <Form.Item
589+ // name="modelSize"
590+ // label={t('dataAnnotation.create.form.modelSize')}
591+ // rules={[{ required: true, message: t('dataAnnotation.create.form.modelSizeRequired') }]}
592+ // initialValue="l"
593+ // >
594+ // <Select>
595+ // <Option value="n">{t('dataAnnotation.home.autoModelSizeLabels.n')}</Option>
596+ // <Option value="s">{t('dataAnnotation.home.autoModelSizeLabels.s')}</Option>
597+ // <Option value="m">{t('dataAnnotation.home.autoModelSizeLabels.m')}</Option>
598+ // <Option value="l">{t('dataAnnotation.home.autoModelSizeLabels.l')}</Option>
599+ // <Option value="x">{t('dataAnnotation.home.autoModelSizeLabels.x')}</Option>
600+ // </Select>
601+ // </Form.Item>
602+ //
603+ // <Form.Item
604+ // name="confThreshold"
605+ // label={t('dataAnnotation.create.form.confThreshold')}
606+ // rules={[{ required: true, message: t('dataAnnotation.create.form.confThresholdRequired') }]}
607+ // initialValue={0.7}
608+ // >
609+ // <Slider
610+ // min={0.1}
611+ // max={0.9}
612+ // step={0.05}
613+ // tooltip={{ formatter: (v) => `${(v || 0) * 100}%` }}
614+ // />
615+ // </Form.Item>
616+ //
617+ // <Form.Item label={t('dataAnnotation.create.form.targetClasses')}>
618+ // <Checkbox
619+ // checked={selectAllClasses}
620+ // onChange={(e) => handleClassSelectionChange(e.target.checked)}
621+ // >
622+ // {t('dataAnnotation.create.form.selectAllClasses')}
623+ // </Checkbox>
624+ // {!selectAllClasses && (
625+ // <Form.Item name="targetClasses" noStyle>
626+ // <Select mode="multiple" placeholder={t('dataAnnotation.create.form.selectTargetClasses')} style={{ marginTop: 8 }}>
627+ // {COCO_CLASSES.map((cls) => (
628+ // <Option key={cls.id} value={cls.id}>
629+ // {cls.label} ({cls.name})
630+ // </Option>
631+ // ))}
632+ // </Select>
633+ // </Form.Item>
634+ // )}
635+ // </Form.Item>
636+ // </Form>
637+ // ),
638+ // },
647639 ] }
648640 />
649641 </ Modal >
0 commit comments