From 9c89f087c8b1a063d7702f8e2ae80867eccdf35a Mon Sep 17 00:00:00 2001 From: weiweiw <14335254+weiweiw22@user.noreply.gitee.com> Date: Wed, 4 Dec 2024 17:49:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=A0=87=E6=B3=A8=E4=BA=BA?= =?UTF-8?q?=E5=92=8C=E5=AE=A1=E6=A0=B8=E4=BA=BA=E7=9A=84=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=20=E5=88=86=E9=85=8D=E6=A0=87=E6=B3=A8?= =?UTF-8?q?=E5=92=8C=E5=AE=A1=E6=A0=B8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/domain/DataSetBasicFileEntity.java | 8 ++ .../domain/dataset/AnnotationTaskEntity.java | 25 ++++- .../java/com/bonus/ai/utils/AverageUtil.java | 106 +++++++++++++----- 3 files changed, 109 insertions(+), 30 deletions(-) diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/DataSetBasicFileEntity.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/DataSetBasicFileEntity.java index e21c1e0..adb6ad3 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/DataSetBasicFileEntity.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/DataSetBasicFileEntity.java @@ -73,4 +73,12 @@ public class DataSetBasicFileEntity extends BaseEntity { /**查询目的,表示文件在当前任务下的标注状态*/ String fileAnnotationStatus; String annotationResult; + public DataSetBasicFileEntity (){} + public DataSetBasicFileEntity(Long fileId, Long parentId,String ancestors, String fileName, String fileUrl){ + this.fileId = fileId; + this.parentId = parentId; + this.ancestors = ancestors; + this.fileName = fileName; + this.fileUrl = fileUrl; + } } 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 1fe4cd3..604c66f 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 @@ -8,6 +8,7 @@ import lombok.Data; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; +import javax.jws.soap.SOAPBinding; import java.util.Date; import java.util.List; @@ -46,10 +47,10 @@ public class AnnotationTaskEntity extends BaseEntity { /**标注人员列表*/ - private List annotators; + private List annotators; /**审核人员列表*/ - private List reviewers; + private List reviewers; /**分配后子任务,一个标注文件对应一个子任务*/ private List subAnnotationTasks; @@ -79,5 +80,23 @@ public class AnnotationTaskEntity extends BaseEntity { private String lastVersionName; - + @Data + public static class UserFileCount{ + //人员id + private Long id; + //文件数量 + private int num; + /*0 审核,1标注*/ + private String type; + public UserFileCount(){ + this.id = 0L; + this.num = 0; + this.type = "1"; + } + public UserFileCount(Long userId, int fileCount, String type){ + this.id = userId; + this.num = fileCount; + this.type = type; + } + } } 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 index 5214562..6ec9985 100644 --- 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 @@ -3,73 +3,125 @@ package com.bonus.ai.utils; import com.bonus.ai.domain.DataSetBasicFileEntity; import com.bonus.ai.domain.dataset.AnnotationTaskAnnotatorEntity; import com.bonus.ai.domain.dataset.AnnotationTaskEntity; -import com.bonus.ai.domain.dataset.DatasetFile; import com.bonus.common.security.utils.SecurityUtils; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class AverageUtil { /** - * 将文件集合分别平分到 annotators 和 reviewers 中 + * 将文件集合按照要求的数量分配给相应的annotators 和 reviewers * @param files 文件集合 * @param taskEntity 标注任务实体 * @return 分配结果,包含标注者和审核者的文件分配 */ public static List distributeFiles(List files, AnnotationTaskEntity taskEntity) { - List annotatorEntities = new ArrayList<>(); + List assignments = new ArrayList<>(); - List annotators = taskEntity.getAnnotators(); // 获取标注者列表 - List reviewers = taskEntity.getReviewers(); // 获取审核者列表 + List annotators = taskEntity.getAnnotators(); // 获取标注者列表 + List reviewers = taskEntity.getReviewers(); // 获取审核者列表 //标注者与审核者都为空时,默认为当前用户 if(("1").equals(taskEntity.getIsStartTeam())){ if (annotators == null || annotators.size() == 0 ) { annotators = new ArrayList<>(); Long userId = SecurityUtils.getUserId(); - annotators.add(userId); + annotators.add(new AnnotationTaskEntity.UserFileCount(userId,files.size(),"1")); } if (reviewers == null || reviewers.size() == 0) { reviewers = new ArrayList<>(); Long userId = SecurityUtils.getUserId(); - reviewers.add(userId); + reviewers.add(new AnnotationTaskEntity.UserFileCount(userId,files.size(),"0")); } }else{ if (annotators == null || annotators.size() == 0) { annotators = new ArrayList<>(); Long userId = SecurityUtils.getUserId(); - annotators.add(userId); + annotators.add(new AnnotationTaskEntity.UserFileCount(userId,files.size(),"1")); } if (reviewers == null || reviewers.size() == 0) { reviewers = new ArrayList<>(); Long userId = SecurityUtils.getUserId(); - reviewers.add(userId); + reviewers.add(new AnnotationTaskEntity.UserFileCount(userId,files.size(),"0")); } } - //这里应该是根据标注者列表和审核人列表里的人 与文件相关进行平均分 - // 平分文件给标注者 - 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() 方法 + // 创建迭代器以便可以安全地移除已分配的文件 + Iterator fileIterator = files.iterator(); - //这里需要将基础文件的url也获取并赋值 - entity.setFileUrl(files.get(i).getFileUrl() ); - annotatorEntities.add(entity); + for (DataSetBasicFileEntity file : files) { + + // 为文件寻找一个标注人员 + AnnotationTaskEntity.UserFileCount annotator = findUserWithQuota(annotators); + AnnotationTaskEntity.UserFileCount reviewer = findUserWithQuota(reviewers); + + if (annotator != null && reviewer != null) { + // 创建一个任务分配实体 + AnnotationTaskAnnotatorEntity assignment = new AnnotationTaskAnnotatorEntity(); + assignment.setAnnotatorId(annotator.getId()); + assignment.setReviewerId(reviewer.getId()); + assignment.setTaskId(taskEntity.getTaskId()); + assignment.setFileId(file.getFileId()); + assignment.setFileUrl(file.getFileUrl()); + // 添加到结果列表 + assignments.add(assignment); + + // 减少标注人员和审核人员的文件配额 + annotator.setNum(annotator.getNum() - 1); + reviewer.setNum(reviewer.getNum() - 1); + } else { + // 如果没有足够的人员,停止分配 + break; + } } - // 平分文件给审核者 - for (int i = 0; i < annotatorEntities.size(); i++) { - Long reviewerId = reviewers.get(i % reviewers.size()); // 轮流分配给审核者 - annotatorEntities.get(i).setReviewerId(reviewerId); - } - return annotatorEntities; + return assignments; + } + + /** + * 在用户列表中寻找有剩余配额的用户 + */ + private static AnnotationTaskEntity.UserFileCount findUserWithQuota(List users) { + for (AnnotationTaskEntity.UserFileCount user : users) { + if (user.getNum() > 0) { + return user; + } + } + return null; // 无法找到符合条件的用户 + } + + public static void main(String[] args) { + // 示例数据 + List files = Arrays.asList( + new DataSetBasicFileEntity(1L, 0L, "0", "file1", "url1"), + new DataSetBasicFileEntity(2L, 0L, "0", "file2", "url2"), + new DataSetBasicFileEntity(3L, 0L, "0", "file3", "url3") + ); + + List annators = Arrays.asList( + new AnnotationTaskEntity.UserFileCount(1L, 2, "1"), // 用户1可以标注2个文件 + new AnnotationTaskEntity.UserFileCount(2L, 1, "1") // 用户2可以审核1个文件 + ); + List reviewers = Arrays.asList(// 用户2可以标注1个文件 + new AnnotationTaskEntity.UserFileCount(2L, 3, "0") // 用户2可以审核1个文件 + ); + + AnnotationTaskEntity task = new AnnotationTaskEntity(); + + task.setReviewers(reviewers); + task.setAnnotators(annators); + // 分配文件 + List assignments = distributeFiles(files, task); + + // 打印分配结果 + assignments.forEach(a -> System.out.println( + "AnnotatorId: " + a.getAnnotatorId() + + ", ReviewerId: " + a.getReviewerId() + + ", FileId: " + a.getFileId() + + ", FileUrl: " + a.getFileUrl())); } }