提交代码

This commit is contained in:
jiang 2024-11-26 19:12:59 +08:00
parent bd7a787e55
commit 2716b02095
7 changed files with 131 additions and 52 deletions

View File

@ -45,7 +45,6 @@ public class AnnotationTaskController extends BaseController {
*/ */
@PostMapping("/edit") @PostMapping("/edit")
public AjaxResult edit(@Validated @RequestBody AnnotationTaskEntity task) { public AjaxResult edit(@Validated @RequestBody AnnotationTaskEntity task) {
int status = annotationTaskService.updateTask(task); int status = annotationTaskService.updateTask(task);
return status == 1 ? AjaxResult.success() : AjaxResult.error("更新任务失败"); return status == 1 ? AjaxResult.success() : AjaxResult.error("更新任务失败");
} }

View File

@ -6,12 +6,15 @@ import com.bonus.common.core.web.controller.BaseController;
import com.bonus.ai.service.dataset.DatasetService; import com.bonus.ai.service.dataset.DatasetService;
import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo; import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.security.annotation.RequiresPermissions;
import com.bonus.common.security.utils.SecurityUtils; import com.bonus.common.security.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -86,6 +89,17 @@ public class DatasetController extends BaseController {
} }
} }
/**
* 查看由我创建的数据集
* 统一获取文件列表
* @param
* @return 返回满足条件的数据集列表
*/
@GetMapping("/datasetList")
public AjaxResult datasetList(DataSetEntity dataSet) {
return AjaxResult.success(datasetService.getDatasetList(dataSet));
}
/** /**
* 根据数据集编号获取数据集详情 * 根据数据集编号获取数据集详情
* @param datasetId 数据集编号 * @param datasetId 数据集编号
@ -136,8 +150,8 @@ public class DatasetController extends BaseController {
* @param isPublic 是否设置为公共文件true - 设置为公共文件, false - 取消公共状态 * @param isPublic 是否设置为公共文件true - 设置为公共文件, false - 取消公共状态
* @return 操作结果 * @return 操作结果
*/ */
@PostMapping("/set-public") @PostMapping("/setPublic")
public AjaxResult setDatasetPublicStatus(@RequestParam Long datasetId, @RequestParam Boolean isPublic){ public AjaxResult setDatasetPublicStatus(@RequestParam String datasetId, @RequestParam String isPublic){
datasetService.setPublicStatus(datasetId, isPublic); datasetService.setPublicStatus(datasetId, isPublic);
return AjaxResult.success(); return AjaxResult.success();
} }
@ -147,16 +161,17 @@ public class DatasetController extends BaseController {
* @return 返回满足条件的版本列表 * @return 返回满足条件的版本列表
*/ */
@PostMapping("/import") @PostMapping("/import")
public AjaxResult importDataset() { public AjaxResult importDataset(@RequestBody DataSetEntity entity) {
return null; return datasetService.importDataset(entity);
} }
/** /**
* 数据集导出 * 数据集导出
* @return 返回满足条件的版本列表 * @return 返回满足条件的版本列表
*/ */
@PostMapping("/export") @PostMapping("/export/{datasetId}")
public AjaxResult exportDataset() { public void exportDataset(HttpServletResponse response, HttpServletRequest request, @PathVariable Long datasetId) {
return null; datasetService.exportDataset(request,response,datasetId);
} }
} }

View File

@ -50,7 +50,7 @@ public interface DatasetMapper {
/** /**
* 更新数据集公开状态 * 更新数据集公开状态
*/ */
int updatePublicStatus(@Param("datasetId") Long datasetId, @Param("isPublic") String isPublic); int updatePublicStatus(@Param("datasetId") String datasetId, @Param("isPublic") String isPublic);
/** /**
* 更新数据集标注状态 * 更新数据集标注状态

View File

@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -55,21 +56,20 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
* 创建标注任务 * 创建标注任务
*/ */
@Override @Override
public int createTask(AnnotationTaskEntity task){ public int createTask(AnnotationTaskEntity task) {
task.setCreateBy(SecurityUtils.getUserId().toString());
int status =0; int status = 0;
//1.调用label studio 接口创建project将projectid 关联到标注任务里 //1.调用label studio 接口创建project将projectid 关联到标注任务里
//2.插入标注任务表 //2.插入标注任务表
String uuid = UUID.randomUUID().toString().replace("-", ""); String uuid = UUID.randomUUID().toString().replace("-", "");
task.setTaskUuid(uuid); task.setTaskUuid(uuid);
status= annotationTaskMapper.insertAnnotationTask(task); status = annotationTaskMapper.insertAnnotationTask(task);
AnnotationTaskEntity tempTask = new AnnotationTaskEntity(); AnnotationTaskEntity tempTask = new AnnotationTaskEntity();
tempTask.setTaskUuid(uuid); tempTask.setTaskUuid(uuid);
List<AnnotationTaskEntity> tempTasks = annotationTaskMapper.selectAnnotationTaskList(task); List<AnnotationTaskEntity> tempTasks = annotationTaskMapper.selectAnnotationTaskList(task);
Long annotationTaskid = 0L; Long annotationTaskid = 0L;
if (!tempTasks.isEmpty()){ if (!tempTasks.isEmpty()) {
annotationTaskid = tempTasks.get(0).getTaskId(); annotationTaskid = tempTasks.get(0).getTaskId();
} }
@ -86,12 +86,12 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
//4. 文件分配后需要调用label studio 接口创建task将taskid与 文件和标注人表进行关联因为文件较多启用异步调用 //4. 文件分配后需要调用label studio 接口创建task将taskid与 文件和标注人表进行关联因为文件较多启用异步调用
// 5. 将文件和标注人等信息 插入文件和标注人关联表 // 5. 将文件和标注人等信息 插入文件和标注人关联表
if(status == 1){ if (status == 1) {
try { try {
for(AnnotationTaskAnnotatorEntity entity:annotationTaskAnnotatorEntities){ for (AnnotationTaskAnnotatorEntity entity : annotationTaskAnnotatorEntities) {
status = annotationTaskMapper.insertAnnotTaskannotator(entity); status = annotationTaskMapper.insertAnnotTaskannotator(entity);
} }
}catch (Exception e){ } catch (Exception e) {
log.error("Error updating task: ", e); log.error("Error updating task: ", e);
throw e; // 抛出异常以触发回滚 throw e; // 抛出异常以触发回滚
} }
@ -101,10 +101,10 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
/** /**
* 获取任务列表分配给我的标注任务我创建的标注任务 * 获取任务列表分配给我的标注任务我创建的标注任务
*/ */
@Override @Override
public List<AnnotationTaskEntity> getTaskList(AnnotationTaskEntity task){ public List<AnnotationTaskEntity> getTaskList(AnnotationTaskEntity task) {
try { try {
//这样设置不合适设置后会改变真实用户的意图 //这样设置不合适设置后会改变真实用户的意图
// String userId = SecurityUtils.getUserId().toString(); // String userId = SecurityUtils.getUserId().toString();
@ -122,15 +122,14 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
/** /**
* 更新任务 * 更新任务
*/ */
@Override @Override
public int updateTask(AnnotationTaskEntity task){ public int updateTask(AnnotationTaskEntity task) {
int result = 0; int result = 0;
try { try {
result = annotationTaskMapper.updateAnnotationTaskById(task); result = annotationTaskMapper.updateAnnotationTaskById(task);
}catch(Exception e) } catch (Exception e) {
{
e.printStackTrace(); e.printStackTrace();
} }
return result; return result;
@ -139,6 +138,7 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
/** /**
* 根据taskid 删除任务 * 根据taskid 删除任务
*
* @param taskId * @param taskId
* @return * @return
*/ */
@ -146,13 +146,13 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
public int deleteTaskById(Long taskId) { public int deleteTaskById(Long taskId) {
//删除任务需要删除两个个表 对应两个个表删除状态修改成1 //删除任务需要删除两个个表 对应两个个表删除状态修改成1
int status = 0; int status = 0;
try{ try {
//删除主表任务信息 //删除主表任务信息
status = annotationTaskMapper.deleteTaskById(taskId); status = annotationTaskMapper.deleteTaskById(taskId);
//删除团队成员表信息 //删除团队成员表信息
status = annotationTaskMapper.deleteAnnotator(taskId); status = annotationTaskMapper.deleteAnnotator(taskId);
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return status; return status;
@ -160,6 +160,7 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
/** /**
* 获取任务详情 * 获取任务详情
*
* @param taskId * @param taskId
* @return * @return
*/ */
@ -171,18 +172,18 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
task.setTaskId(taskId); task.setTaskId(taskId);
//查询对应的label studio project id , 从label studio这个标注任务对应的label studio project //查询对应的label studio project id , 从label studio这个标注任务对应的label studio project
List<AnnotationTaskEntity> resultTasks = annotationTaskMapper.selectAnnotationTaskList(task); List<AnnotationTaskEntity> resultTasks = annotationTaskMapper.selectAnnotationTaskList(task);
if (!resultTasks.isEmpty()) { if (!resultTasks.isEmpty()) {
return resultTasks.get(0); return resultTasks.get(0);
} }
} catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
} }
@Override @Override
public List<DataSetBasicFileEntity> getMyAnnotaionTaskBasicFile(Long taskId, String annotationStatus){ public List<DataSetBasicFileEntity> getMyAnnotaionTaskBasicFile(Long taskId, String annotationStatus) {
try { try {
Long userId = SecurityUtils.getUserId(); Long userId = SecurityUtils.getUserId();
AnnotationTaskEntity task = new AnnotationTaskEntity(); AnnotationTaskEntity task = new AnnotationTaskEntity();
@ -196,14 +197,14 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
} }
task.setFileAnnotationStatus(annotationStatus); task.setFileAnnotationStatus(annotationStatus);
return annotationTaskMapper.getTaskBasicFile(task); return annotationTaskMapper.getTaskBasicFile(task);
}catch(Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return new ArrayList<>(); return new ArrayList<>();
} }
} }
@Override @Override
public List<DataSetBasicFileEntity> getMyAuditTaskBasicFile(Long taskId, String annotationStatus){ public List<DataSetBasicFileEntity> getMyAuditTaskBasicFile(Long taskId, String annotationStatus) {
Long userId = SecurityUtils.getUserId(); Long userId = SecurityUtils.getUserId();
AnnotationTaskEntity task = new AnnotationTaskEntity(); AnnotationTaskEntity task = new AnnotationTaskEntity();
task.setTaskId(taskId); task.setTaskId(taskId);
@ -211,8 +212,7 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
Long intAnnotationStatus = Long.valueOf(annotationStatus); Long intAnnotationStatus = Long.valueOf(annotationStatus);
if (intAnnotationStatus < 4 && intAnnotationStatus >= 0) { if (intAnnotationStatus < 4 && intAnnotationStatus >= 0) {
task.setFileAnnotationStatus(annotationStatus); task.setFileAnnotationStatus(annotationStatus);
} } else {
else {
task.setFileAnnotationStatus("5"); task.setFileAnnotationStatus("5");
} }
return annotationTaskMapper.getTaskBasicFile(task); return annotationTaskMapper.getTaskBasicFile(task);
@ -220,10 +220,10 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
@Override @Override
public String getAuditFailReasonByFileId(Long taskId, Long fileId){ public String getAuditFailReasonByFileId(Long taskId, Long fileId) {
try { try {
return annotationTaskMapper.getAuditFailReasonByFileId(taskId, fileId); return annotationTaskMapper.getAuditFailReasonByFileId(taskId, fileId);
}catch(Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return ""; return "";
} }
@ -231,11 +231,12 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService {
/** /**
* 检查任务名称是否重复 * 检查任务名称是否重复
*
* @param task * @param task
* @return * @return
*/ */
@Override @Override
public boolean checkTaskNameUnique(AnnotationTaskEntity task){ public boolean checkTaskNameUnique(AnnotationTaskEntity task) {
return false; return false;
} }

View File

@ -8,9 +8,15 @@ import com.bonus.ai.mapper.DataSetBasicFileMapper;
import com.bonus.ai.mapper.DatasetFileMapper; import com.bonus.ai.mapper.DatasetFileMapper;
import com.bonus.ai.mapper.DatasetMapper; import com.bonus.ai.mapper.DatasetMapper;
import com.bonus.ai.service.dataset.DatasetService; import com.bonus.ai.service.dataset.DatasetService;
import com.bonus.ai.utils.MinioUtil;
import com.bonus.common.core.constant.UserConstants; import com.bonus.common.core.constant.UserConstants;
import com.bonus.common.core.utils.StringUtils; import com.bonus.common.core.utils.StringUtils;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.security.utils.SecurityUtils; import com.bonus.common.security.utils.SecurityUtils;
import io.minio.Result;
import io.minio.errors.MinioException;
import io.minio.messages.Item;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -19,11 +25,18 @@ import org.springframework.transaction.annotation.Transactional;
import com.bonus.common.security.utils.SecurityUtils; import com.bonus.common.security.utils.SecurityUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Service @Service
public class DatasetServiceImpl implements DatasetService { public class DatasetServiceImpl implements DatasetService {
@ -44,6 +57,9 @@ public class DatasetServiceImpl implements DatasetService {
@Resource @Resource
private DataSetBasicFileMapper dataSetBasicFileMapper; private DataSetBasicFileMapper dataSetBasicFileMapper;
@Resource
private MinioUtil minioUtil;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int createDataset(DataSetEntity dataSet) { public int createDataset(DataSetEntity dataSet) {
@ -113,9 +129,9 @@ public class DatasetServiceImpl implements DatasetService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean setPublicStatus(Long datasetId, Boolean isPublic) { public boolean setPublicStatus(String datasetId, String isPublic) {
try { try {
datasetMapper.updatePublicStatus(datasetId, String.valueOf(isPublic ?'1':'0')); datasetMapper.updatePublicStatus(datasetId, isPublic);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error("设置数据集公共状态失败", e); log.error("设置数据集公共状态失败", e);
@ -157,6 +173,53 @@ public class DatasetServiceImpl implements DatasetService {
return datasetMapper.removeDataSetBasicFile(dataSetId,fileIds); return datasetMapper.removeDataSetBasicFile(dataSetId,fileIds);
} }
/**
* @param entity
* @return
*/
@Override
public AjaxResult importDataset(DataSetEntity entity) {
insertDatasetFileMap(entity);
return AjaxResult.success();
}
/**
* @param request
* @param response
* @param datasetId
*/
@Override
public void exportDataset(HttpServletRequest request, HttpServletResponse response, Long datasetId) {
List<DataSetBasicFileEntity> list = datasetFileMapper.selectFilesByDatasetId(datasetId);
try {
downloadMultipleFiles(response,list);
}catch (Exception e){
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
// 下载多个文件可以选择压缩成 ZIP
private void downloadMultipleFiles(HttpServletResponse response, List<DataSetBasicFileEntity> list) throws IOException, MinioException {
// 示例将多个文件打包成一个 ZIP 文件
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=files.zip");
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
for (DataSetBasicFileEntity entity : list) {
InputStream fileStream = minioUtil.downloadFile(entity.getFileUrl());
// 创建 ZIP 条目
ZipEntry zipEntry = new ZipEntry(entity.getFileName());
zos.putNextEntry(zipEntry);
// 使用 IOUtils.copy 直接复制文件流
IOUtils.copy(fileStream, zos);
zos.closeEntry();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/** /**
* 插入数据集文件映射关系 * 插入数据集文件映射关系
* @param dataSet 数据集实体包含数据集ID输入ID数据类型等信息 * @param dataSet 数据集实体包含数据集ID输入ID数据类型等信息

View File

@ -2,7 +2,10 @@ package com.bonus.ai.service.dataset;
import com.bonus.ai.domain.DataSetBasicFileEntity; import com.bonus.ai.domain.DataSetBasicFileEntity;
import com.bonus.ai.domain.dataset.DataSetEntity; import com.bonus.ai.domain.dataset.DataSetEntity;
import com.bonus.common.core.web.domain.AjaxResult;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
public interface DatasetService { public interface DatasetService {
@ -47,7 +50,7 @@ public interface DatasetService {
* @param isPublic 是否公共 * @param isPublic 是否公共
* @return 设置结果 * @return 设置结果
*/ */
boolean setPublicStatus(Long datasetId, Boolean isPublic); boolean setPublicStatus(String datasetId, String isPublic);
/**验证数据集名称的唯一性*/ /**验证数据集名称的唯一性*/
boolean checkDatasetNameUnique(DataSetEntity dataSet); boolean checkDatasetNameUnique(DataSetEntity dataSet);
@ -65,4 +68,8 @@ public interface DatasetService {
* @return * @return
*/ */
int removeDataSetBasicFile(String dataSetId, long[] fileIds); int removeDataSetBasicFile(String dataSetId, long[] fileIds);
AjaxResult importDataset(DataSetEntity entity);
void exportDataset(HttpServletRequest request, HttpServletResponse response, Long datasetId);
} }

View File

@ -8,14 +8,8 @@
<result property="datasetId" column="dataset_id" /> <result property="datasetId" column="dataset_id" />
</resultMap> </resultMap>
<!-- &lt;!&ndash; 插入数据集文件映射关系 &ndash;&gt;-->
<!-- <insert id="insertDatasetFile" parameterType="com.bonus.ai.domain.dataset.DatasetFile">-->
<!-- INSERT INTO ai_dataset_file_map (file_id, dataset_id, is_annotated)-->
<!-- VALUES (#{fileId}, #{datasetId}, #{isAnnotated})-->
<!-- </insert>-->
<insert id="batchDatasetFile"> <insert id="batchDatasetFile">
insert into ai_dataset_file_map(file_id, dataset_id) values replace into ai_dataset_file_map(file_id, dataset_id) values
<foreach item="item" index="index" collection="list" separator=","> <foreach item="item" index="index" collection="list" separator=",">
(#{item.fileId},#{item.datasetId}) (#{item.fileId},#{item.datasetId})
</foreach> </foreach>
@ -44,7 +38,7 @@
<!-- 根据数据集ID查询文件列表 --> <!-- 根据数据集ID查询文件列表 -->
<select id="selectFilesByDatasetId" parameterType="Long" resultType="com.bonus.ai.domain.DataSetBasicFileEntity"> <select id="selectFilesByDatasetId" parameterType="Long" resultType="com.bonus.ai.domain.DataSetBasicFileEntity">
SELECT bf.file_id AS fileId, bf.file_url AS fileUrl SELECT bf.file_id AS fileId, bf.file_url AS fileUrl,bf.file_name AS fileName
FROM ai_dataset_file_map df FROM ai_dataset_file_map df
left join ai_basic_file bf on bf.file_id = df.file_id left join ai_basic_file bf on bf.file_id = df.file_id
WHERE df.dataset_id = #{datasetId} WHERE df.dataset_id = #{datasetId}