diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/client/OnlineAnnotateUtil.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/client/OnlineAnnotateUtil.java
index 541cc89..8df90d3 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/client/OnlineAnnotateUtil.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/client/OnlineAnnotateUtil.java
@@ -1,21 +1,24 @@
package com.bonus.ai.client;
+import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
public class OnlineAnnotateUtil {
+ final static String template = ".*?";
/**
* 替换 View 中的 Label 标签内容
- * @param template 原始字符串模板
* @param labels 要替换的 labels 列表
* @return 替换后的字符串
*/
- public static String rectangleImageLabels(String template, List labels) {
+ public static String rectangleImageLabels(List labels) {
if (labels == null || labels.isEmpty()){
return "";
}
// 构建新的 Label 标签内容
StringBuilder labelBuilder = new StringBuilder();
- String[] colors = {"#FFA39E", "#D4380D", "#36CFC9", "#FF85C0", "#FFD666"}; // 颜色数组
+ String[] colors = {"blue", "green", "orange", "purge"}; // 颜色数组
int colorIndex = 0;
for (String label : labels) {
@@ -36,5 +39,20 @@ public class OnlineAnnotateUtil {
);
}
-
+/**
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+ public static void main(String[] args) {
+// List labels = Arrays.asList("label1", "label2", "label3");
+ List labels = Stream.of("label1", "label2", "label3")
+ .collect(Collectors.toList());
+ String result = rectangleImageLabels(labels);
+ System.out.println(result);
+ }
}
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DataSetBasicFileController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DataSetBasicFileController.java
index 4c98700..80b8ee6 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DataSetBasicFileController.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DataSetBasicFileController.java
@@ -2,8 +2,6 @@ package com.bonus.ai.controller;
import com.bonus.ai.domain.DataSetBasicFileEntity;
import com.bonus.ai.service.DataSetBasicFileService;
-import com.bonus.common.core.constant.HttpStatus;
-import com.bonus.common.core.utils.Base64Utils;
import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java
index 079c098..f0c22dc 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java
@@ -28,7 +28,8 @@ public class AnnotationTaskController extends BaseController {
*/
@PostMapping("/create")
public AjaxResult add(@Validated @RequestBody AnnotationTaskEntity task) {
- return AjaxResult.success();
+ int status = annotationTaskService.createTask(task);
+ return status == 1 ? AjaxResult.success() : AjaxResult.error("创建任务失败");
}
/**修改任务
@@ -37,6 +38,7 @@ public class AnnotationTaskController extends BaseController {
*/
@PostMapping("/edit")
public AjaxResult edit(@Validated @RequestBody AnnotationTaskEntity task) {
+
return AjaxResult.success();
}
@@ -47,6 +49,7 @@ public class AnnotationTaskController extends BaseController {
*/
@PostMapping("/delete/{taskId}")
public AjaxResult remove(@PathVariable Long taskId) {
+ annotationTaskService.deleteTaskById(taskId);
return AjaxResult.success();
}
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskAnnotatorMap.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskAnnotatorEntity.java
similarity index 90%
rename from bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskAnnotatorMap.java
rename to bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskAnnotatorEntity.java
index ad3224c..8f05907 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskAnnotatorMap.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskAnnotatorEntity.java
@@ -1,10 +1,12 @@
package com.bonus.ai.domain.dataset;
import lombok.Data;
+import org.springframework.stereotype.Component;
import java.util.Date;
@Data
-public class AnnotationTaskAnnotatorMap {
+@Component
+public class AnnotationTaskAnnotatorEntity {
private Long annotatorId; // 标注人员
private Long reviewerId; // 审核人员
@@ -22,4 +24,4 @@ public class AnnotationTaskAnnotatorMap {
private String updateBy; // 更新者
private Date updateTime; // 更新时间
private Date createTime; // 创建时间
-}
\ No newline at end of file
+}
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskEntity.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskEntity.java
index ec22caf..be9cb6b 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskEntity.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/dataset/AnnotationTaskEntity.java
@@ -4,10 +4,13 @@ import com.bonus.ai.domain.enums.AnnotationFileStatus;
import com.bonus.ai.domain.enums.AnnotationTaskStatus;
import com.bonus.common.core.web.domain.BaseEntity;
import lombok.Data;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
import java.util.List;
@Data
+@Component
public class AnnotationTaskEntity extends BaseEntity {
/**任务名称*/
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/AnnotationTaskMapper.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/AnnotationTaskMapper.java
index bb79628..181b014 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/AnnotationTaskMapper.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/AnnotationTaskMapper.java
@@ -1,5 +1,6 @@
package com.bonus.ai.mapper;
+import com.bonus.ai.domain.dataset.AnnotationTaskAnnotatorEntity;
import com.bonus.ai.domain.dataset.AnnotationTaskEntity;
import java.util.List;
@@ -38,7 +39,7 @@ public interface AnnotationTaskMapper
* @param taskId 任务ID
* @return 标注任务实体
*/
- AnnotationTaskEntity selectAnnotationTaskById(Long taskId);
+ // AnnotationTaskEntity selectAnnotationTaskById(Long taskId);
/**
* 查询标注任务列表
@@ -46,4 +47,12 @@ public interface AnnotationTaskMapper
* @return 标注任务列表
*/
List selectAnnotationTaskList(AnnotationTaskEntity annotationTask);
-}
\ No newline at end of file
+
+ int insertAnnotTaskannotator(List annotationTaskAnnotatorEntities);
+
+ int deleteTaskById(Long taskId);
+
+ int deleteAnnotator(Long taskId);
+
+ AnnotationTaskEntity selectAnnotationTaskListUUID(Long taskId);
+}
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java
index b3df0e9..55a42a6 100644
--- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java
@@ -1,19 +1,20 @@
package com.bonus.ai.service.Impl.dataset;
-import com.bonus.ai.client.OnlineAnnotateUtil;
+import com.alibaba.fastjson.JSON;
import com.bonus.ai.client.OnlineAnnotationService;
import com.bonus.ai.client.ProjectParam;
-import com.bonus.ai.client.TaskParam;
-import com.bonus.ai.config.MinioConfig;
import com.bonus.ai.config.OnlineAnnotateConfig;
-import com.bonus.ai.domain.dataset.AnnotationSubTaskEntity;
-import com.bonus.ai.domain.dataset.AnnotationTaskEntity;
-import com.bonus.ai.domain.dataset.DataSetEntity;
+import com.bonus.ai.domain.dataset.*;
+import com.bonus.ai.mapper.AnnotationTaskMapper;
+import com.bonus.ai.mapper.DatasetFileMapper;
import com.bonus.ai.service.dataset.AnnotationTaskService;
+import com.bonus.ai.utils.AverageUtil;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-
import javax.annotation.Resource;
+import java.util.List;
+import java.util.UUID;
@Slf4j
@Service
@@ -26,21 +27,51 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
@Resource
private OnlineAnnotateConfig onlineAnnotateConfig;
+ @Resource
+ private AnnotationTaskMapper annotationTaskMapper;
+
+ @Resource
+ private DatasetFileMapper datasetFileMapper;
+
+ @Autowired
+ private AnnotationTaskEntity annotationTaskEntity;
+
+ @Autowired
+ private AnnotationTaskAnnotatorEntity annotationTaskAnnotatorEntity;
+
/**
* 创建标注任务
*/
@Override
public int createTask(AnnotationTaskEntity task) {
+ int status =0;
// TODO 调用label studio 接口获取其project id
ProjectParam lSProject = new ProjectParam();
lSProject.setTitle(task.getTaskName());
lSProject.setDescription(task.getTaskDesc());
//需要将标签转换为json格式
lSProject.setLabelConfig(task.getLabels());
- onlineAnnotationService.createProject(lSProject, onlineAnnotateConfig.getApikey());
+ String project = onlineAnnotationService.createProject(lSProject, onlineAnnotateConfig.getApikey());
+ List projectParams = JSON.parseArray(project, ProjectParam.class);
+ if (projectParams.size() > 0) {
+ Long projectId = Long.valueOf(projectParams.get(0).getId());
+ task.setProjectId(projectId);
+ for(ProjectParam projectParam: projectParams){
+ //需要生成32位uuid
+ String uuid = UUID.randomUUID().toString().replace("-", "");
+ task.setTaskUuid(uuid);
+ status= annotationTaskMapper.insertAnnotationTask(task);
+ }
+ }
+ //通过数据集id 从数据集和文件关联关系表获取文件信息
+ List datafile = datasetFileMapper.selectFilesByDatasetId(task.getDatasetId());
//TODO 根据标注任务file list 和标注人信息自动分配
+ List annotationTaskAnnotatorEntities = AverageUtil.distributeFiles(datafile, task);
// 获取project id以后调用AnnotationTaskMapper 和AnnotationTaskAnnotatorMapper 插入数据集
- return 0;
+ if(status == 1){
+ status = annotationTaskMapper.insertAnnotTaskannotator(annotationTaskAnnotatorEntities);
+ }
+ return status;
}
@@ -73,7 +104,21 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
*/
@Override
public int deleteTaskById(Long taskId) {
- return 0;
+ //删除任务需要删除两个个表 对应两个个表删除状态修改成1
+ int status = 0;
+ try{
+ //删除主表任务信息
+ status = annotationTaskMapper.deleteTaskById(taskId);
+ //删除团队成员表信息
+ status = annotationTaskMapper.deleteAnnotator(taskId);
+ //查询对应的uuid
+ AnnotationTaskEntity task = annotationTaskMapper.selectAnnotationTaskListUUID(taskId);
+ //删除对应的标注任务文件关联关系表信息
+ onlineAnnotationService.deleteProjectById(task.getTaskUuid(), onlineAnnotateConfig.getApikey());
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return status;
}
/**
diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/utils/AverageUtil.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/utils/AverageUtil.java
new file mode 100644
index 0000000..9970350
--- /dev/null
+++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/utils/AverageUtil.java
@@ -0,0 +1,45 @@
+package com.bonus.ai.utils;
+
+import com.bonus.ai.domain.dataset.AnnotationTaskAnnotatorEntity;
+import com.bonus.ai.domain.dataset.AnnotationTaskEntity;
+import com.bonus.ai.domain.dataset.DatasetFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AverageUtil {
+
+ /**
+ * 将文件集合分别平分到 annotators 和 reviewers 中
+ * @param files 文件集合
+ * @param taskEntity 标注任务实体
+ * @return 分配结果,包含标注者和审核者的文件分配
+ */
+ public static List distributeFiles(List files, AnnotationTaskEntity taskEntity) {
+ List annotatorEntities = new ArrayList<>();
+
+ List annotators = taskEntity.getAnnotators(); // 获取标注者列表
+ List reviewers = taskEntity.getReviewers(); // 获取审核者列表
+
+ // 平分文件给标注者
+ for (int i = 0; i < files.size(); i++) {
+ Long annotatorId = annotators.get(i % annotators.size()); // 轮流分配给标注者
+ AnnotationTaskAnnotatorEntity entity = new AnnotationTaskAnnotatorEntity();
+ entity.setAnnotatorId(annotatorId); // 设置标注者 ID
+ entity.setFileId(files.get(i).getFileId()); // 假设 DatasetFile 有 getId() 方法
+ annotatorEntities.add(entity);
+ }
+
+ // 平分文件给审核者
+ for (int i = 0; i < files.size(); i++) {
+ Long reviewerId = reviewers.get(i % reviewers.size()); // 轮流分配给审核者
+ AnnotationTaskAnnotatorEntity entity = new AnnotationTaskAnnotatorEntity();
+ entity.setAnnotatorId(reviewerId); // 设置审核者 ID
+ entity.setFileId(files.get(i).getFileId()); // 假设 DatasetFile 有 getId() 方法
+ annotatorEntities.add(entity);
+ }
+
+ return annotatorEntities;
+ }
+
+}
diff --git a/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml b/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml
index e51e92e..33fc212 100644
--- a/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml
+++ b/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml
@@ -28,6 +28,16 @@
FROM ai_annotation_task t
left join ai_annotation_task_annotator_map a on t.task_id = a.task_id
+
+ UPDATE ai_annotation_task
+ SET del_flag = '1'
+ WHERE task_id = #{taskId}
+
+
+ UPDATE ai_annotation_task_annotator_map
+ SET del_flag = '1'
+ WHERE task_id = #{taskId}
+
@@ -57,6 +67,9 @@
AND annotation_status = #{annotateTaskStatus}
+
@@ -96,6 +109,51 @@
#{updateTime},
+
+ INSERT INTO ai_annotation_task_annotator_map
+
+ task_id
+
+ , annotator_id
+
+
+ , reviewer_id
+
+
+ , description
+
+
+ , annotation_status
+
+
+ , annotation_result
+
+
+ , annotation_resource
+
+
+
+ #{taskId}
+
+ , #{annotatorId}
+
+
+ , #{reviewerId}
+
+
+ , #{description}
+
+
+ , #{annotationStatus}
+
+
+ , #{annotationResult}
+
+
+ , #{annotationResource}
+
+
+
diff --git a/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml b/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml
index 55acf76..c496467 100644
--- a/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml
+++ b/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml
@@ -27,13 +27,12 @@
-
- delete from ai_dataset_file_map
- where dataset_id in
+
+ update FROM ai_dataset_file_map
#{datasetId}
-
+