浏览代码

任务创建、移动图片、执行任务

Suuuuuukang 10 月之前
父节点
当前提交
f78d720c1a
共有 19 个文件被更改,包括 420 次插入42 次删除
  1. 13 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/component/ScheduledTasks.java
  2. 14 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java
  3. 3 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java
  4. 2 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskDetailsBo.java
  5. 3 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmModelMapper.java
  6. 5 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.java
  7. 1 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskMapper.java
  8. 1 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationTaskMapper.java
  9. 5 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskService.java
  10. 2 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationTaskService.java
  11. 1 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmModelServiceImpl.java
  12. 3 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
  13. 12 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java
  14. 137 3
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java
  15. 189 29
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java
  16. 3 0
      taais-modules/taais-biz/src/main/resources/mapper/ag/AlgorithmModelMapper.xml
  17. 4 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskDetailsMapper.xml
  18. 11 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskMapper.xml
  19. 11 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationTaskMapper.xml

+ 13 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/component/ScheduledTasks.java

@@ -1,6 +1,8 @@
 package com.taais.biz.component;
 
+import com.taais.biz.controller.TargetIdentificationTaskController;
 import com.taais.biz.service.IAlgorithmTaskService;
+import com.taais.biz.service.impl.TargetIdentificationTaskServiceImpl;
 import jakarta.annotation.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -13,10 +15,21 @@ public class ScheduledTasks {
 
     @Resource
     IAlgorithmTaskService algorithmTaskService;
+
+    @Resource
+    TargetIdentificationTaskServiceImpl targetIdentificationTaskService;
+
     @Scheduled(fixedRate = 10000)
     public void runTask() {
         log.info("ScheduledTasks.runTask start");
         algorithmTaskService.taskRun();
         log.info("ScheduledTasks.runTask end");
     }
+
+    @Scheduled(fixedRate = 10000)
+    public void taskRun() {
+        log.info("ScheduledTasks.taskRun start");
+        targetIdentificationTaskService.taskRun();
+        log.info("ScheduledTasks.taskRun end");
+    }
 }

+ 14 - 1
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java

@@ -3,10 +3,13 @@ package com.taais.biz.controller;
 import java.util.List;
 
 import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
+import com.taais.biz.service.ITargetIdentificationSubtaskService;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.repository.query.Param;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import com.taais.common.core.core.domain.CommonResult;
@@ -109,12 +112,22 @@ public class TargetIdentificationTaskController extends BaseController {
         return CommonResult.success();
     }
 
-    public CommonResult<String> createTask(CreateTargetIdentificationTaskDto taskDto) {
+    @PostMapping("/create")
+    public CommonResult<String> createTask(@RequestBody CreateTargetIdentificationTaskDto taskDto) {
+        System.out.println("received task" + taskDto);
         String errorMsg = targetIdentificationTaskService.createTask(taskDto);
+
         if (StringUtils.isNotEmpty(errorMsg)) {
             return CommonResult.fail(errorMsg);
         } else {
             return CommonResult.success();
         }
     }
+
+    @Log(title = "算法定时任务New", businessType = BusinessType.INSERT)
+    @GetMapping("/taskRun")
+    public CommonResult<Void> taskRun() {
+        targetIdentificationTaskService.taskRun();
+        return CommonResult.success();
+    }
 }

+ 3 - 1
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java

@@ -30,7 +30,7 @@ private static final long serialVersionUID = 1L;
     private Long id;
 
     // 子任务id
-    private Long subTaskId;
+    private Long subtaskId;
 
     /** 任务名称 */
     private String name;
@@ -41,6 +41,8 @@ private static final long serialVersionUID = 1L;
     /** 算法 */
     private Long algorithmId;
 
+    private String type;
+
     /** 数据批次号 */
     private String dataBatchNums;
 

+ 2 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskDetailsBo.java

@@ -46,8 +46,8 @@ public class TargetIdentificationSubtaskDetailsBo extends BaseEntity{
     @NotNull(message = "算法不能为空")
     private Long algorithmId;
 
-    @NotNull(message = "算法不能为空")
-    private String algorithmType;
+    @NotNull(message = "算法URL不能为空")
+    private String type;
 
     /**
      * 数据批次号

+ 3 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmModelMapper.java

@@ -1,6 +1,7 @@
 package com.taais.biz.mapper;
 
 import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.vo.AlgorithmModelVo;
 import org.apache.ibatis.annotations.Mapper;
 import com.taais.biz.domain.AlgorithmModel;
 import org.apache.ibatis.annotations.Param;
@@ -15,4 +16,6 @@ import org.apache.ibatis.annotations.Param;
 public interface AlgorithmModelMapper extends BaseMapper<AlgorithmModel> {
 
     String getModelNameBySubtaskId(@Param("subtaskId") Long subTaskId, @Param("algorithmId") Long algorithmId);
+
+    AlgorithmModelVo getModelByAlgorithmId(@Param("algorithmId") Long algorithmId);
 }

+ 5 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.java

@@ -1,9 +1,13 @@
 package com.taais.biz.mapper;
 
 import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
 import org.apache.ibatis.annotations.Mapper;
 import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
 
+import java.util.List;
+
 /**
  * 目标识别子任务Mapper接口
  *
@@ -13,4 +17,5 @@ import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
 @Mapper
 public interface TargetIdentificationSubtaskDetailsMapper extends BaseMapper<TargetIdentificationSubtaskDetails> {
 
+    List<TargetIdentificationSubtaskDetailsBo> getTargetIdentificationSubtaskDetailsListBySubtaskId(Long subtaskId);
 }

+ 1 - 1
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskMapper.java

@@ -12,5 +12,5 @@ import com.taais.biz.domain.TargetIdentificationSubtask;
  */
 @Mapper
 public interface TargetIdentificationSubtaskMapper extends BaseMapper<TargetIdentificationSubtask> {
-
+    TargetIdentificationSubtask getAvailableSubtask(long taskId);
 }

+ 1 - 1
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationTaskMapper.java

@@ -12,5 +12,5 @@ import com.taais.biz.domain.TargetIdentificationTask;
  */
 @Mapper
 public interface TargetIdentificationTaskMapper extends BaseMapper<TargetIdentificationTask> {
-
+    TargetIdentificationTask getAvailableTask();
 }

+ 5 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskService.java

@@ -3,8 +3,10 @@ package com.taais.biz.service;
 import java.util.List;
 
 import com.taais.biz.domain.TargetIdentificationSubtask;
+import com.taais.biz.domain.TargetIdentificationTask;
 import com.taais.biz.domain.vo.TargetIdentificationSubtaskVo;
 import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.orm.core.service.IBaseService;
 import com.taais.common.core.core.page.PageResult;
 
@@ -47,6 +49,8 @@ public interface ITargetIdentificationSubtaskService extends IBaseService<Target
      */
     boolean insert(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
 
+    TargetIdentificationSubtask insertSubtask(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
     /**
      * 修改目标识别子任务
      *
@@ -63,4 +67,5 @@ public interface ITargetIdentificationSubtaskService extends IBaseService<Target
      */
     boolean deleteByIds(Long[] ids);
 
+    void taskRun(TargetIdentificationTask task);
 }

+ 2 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationTaskService.java

@@ -65,4 +65,6 @@ public interface ITargetIdentificationTaskService extends IBaseService<TargetIde
     boolean deleteByIds(Long[] ids);
 
     String createTask(CreateTargetIdentificationTaskDto o);
+
+    void taskRun();
 }

+ 1 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmModelServiceImpl.java

@@ -64,8 +64,7 @@ public class AlgorithmModelServiceImpl extends BaseServiceImpl<AlgorithmModelMap
      */
     @Override
     public AlgorithmModelVo selectById(Long id) {
-            return this.getOneAs(query().where(ALGORITHM_MODEL.ID.eq(id)), AlgorithmModelVo.class);
-
+            return mapper.getModelByAlgorithmId(id);
     }
 
     /**

+ 3 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java

@@ -116,7 +116,10 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
     @Override
     public DataVo selectById(Long id) {
         return this.getOneAs(query().where(DATA.ID.eq(id)), DataVo.class);
+    }
 
+    public List<DataVo> getDataByBatchNum(String batchNum) {
+        return this.listAs(query().where(DATA.BATCH_NUM.eq(batchNum)), DataVo.class);
     }
 
     /**

+ 12 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java

@@ -32,6 +32,11 @@ public class TargetIdentificationSubtaskDetailsServiceImpl extends BaseServiceIm
     @Resource
     private TargetIdentificationSubtaskDetailsMapper targetIdentificationSubtaskDetailsMapper;
 
+
+    public List<TargetIdentificationSubtaskDetailsBo> getTargetIdentificationSubtaskDetailsListBySubtaskId(Long subtaskId) {
+        return targetIdentificationSubtaskDetailsMapper.getTargetIdentificationSubtaskDetailsListBySubtaskId(subtaskId);
+    }
+
     @Override
     public QueryWrapper query() {
         return super.query().from(TARGET_IDENTIFICATION_SUBTASK_DETAILS);
@@ -41,6 +46,8 @@ public class TargetIdentificationSubtaskDetailsServiceImpl extends BaseServiceIm
         QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
         queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.NAME.like
         (targetIdentificationSubtaskDetailsBo.getName()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.SUBTASK_ID.eq
+            (targetIdentificationSubtaskDetailsBo.getSubtaskId()));
         queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.STATUS.eq
         (targetIdentificationSubtaskDetailsBo.getStatus()));
         queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.ALGORITHM_ID.eq
@@ -113,8 +120,11 @@ public class TargetIdentificationSubtaskDetailsServiceImpl extends BaseServiceIm
      */
     @Override
     public boolean insert(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
-    TargetIdentificationSubtaskDetails targetIdentificationSubtaskDetails =MapstructUtils.convert(targetIdentificationSubtaskDetailsBo, TargetIdentificationSubtaskDetails. class);
-
+        TargetIdentificationSubtaskDetails targetIdentificationSubtaskDetails =MapstructUtils.convert(targetIdentificationSubtaskDetailsBo, TargetIdentificationSubtaskDetails. class);
+        targetIdentificationSubtaskDetails.setSubtaskId(targetIdentificationSubtaskDetailsBo.getSubtaskId());
+        targetIdentificationSubtaskDetails.setType(targetIdentificationSubtaskDetailsBo.getType());
+        System.out.println("convert subdetail: " + targetIdentificationSubtaskDetails);
+        System.out.println("convert before subdetail: " + targetIdentificationSubtaskDetailsBo);
         return this.save(targetIdentificationSubtaskDetails);//使用全局配置的雪花算法主键生成器生成ID值
     }
 

+ 137 - 3
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java

@@ -1,24 +1,38 @@
 package com.taais.biz.service.impl;
 
-import java.util.Arrays;
-import java.util.List;
+import java.lang.reflect.Type;
+import java.util.*;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.*;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.dto.AlgorithmConfigParamDto;
+import com.taais.biz.domain.dto.AlgorithmRequestDto;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.common.core.constant.Constants;
 import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.core.utils.StringUtils;
 import com.taais.common.orm.core.page.PageQuery;
 import com.taais.common.core.core.page.PageResult;
 import com.taais.common.orm.core.service.impl.BaseServiceImpl;
+import com.taais.system.domain.vo.SysOssVo;
 import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.taais.biz.mapper.TargetIdentificationSubtaskMapper;
-import com.taais.biz.domain.TargetIdentificationSubtask;
 import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
 import com.taais.biz.domain.vo.TargetIdentificationSubtaskVo;
 import com.taais.biz.service.ITargetIdentificationSubtaskService;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
 import static com.taais.biz.domain.table.TargetIdentificationSubtaskTableDef.TARGET_IDENTIFICATION_SUBTASK;
 
 /**
@@ -28,10 +42,17 @@ import static com.taais.biz.domain.table.TargetIdentificationSubtaskTableDef.TAR
  * 2024-08-17
  */
 @Service
+@Slf4j
 public class TargetIdentificationSubtaskServiceImpl extends BaseServiceImpl<TargetIdentificationSubtaskMapper, TargetIdentificationSubtask> implements ITargetIdentificationSubtaskService {
     @Resource
     private TargetIdentificationSubtaskMapper targetIdentificationSubtaskMapper;
 
+    @Resource
+    private TargetIdentificationSubtaskDetailsServiceImpl detailsService;
+
+    @Resource
+    private AlgorithmTaskConfigurationServiceImpl algorithmTaskConfigurationService;
+
     @Override
     public QueryWrapper query() {
         return super.query().from(TARGET_IDENTIFICATION_SUBTASK);
@@ -41,6 +62,9 @@ public class TargetIdentificationSubtaskServiceImpl extends BaseServiceImpl<Targ
         QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
         queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK.NAME.like
         (targetIdentificationSubtaskBo.getName()));
+        System.out.println("definition is: " + TARGET_IDENTIFICATION_SUBTASK);
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK.TASK_ID.eq
+            (targetIdentificationSubtaskBo.getTaskId()));
         queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK.STATUS.eq
         (targetIdentificationSubtaskBo.getStatus()));
         queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK.REMARKS.eq
@@ -98,6 +122,15 @@ public class TargetIdentificationSubtaskServiceImpl extends BaseServiceImpl<Targ
         return this.save(targetIdentificationSubtask);//使用全局配置的雪花算法主键生成器生成ID值
     }
 
+    @Override
+    public TargetIdentificationSubtask insertSubtask(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        TargetIdentificationSubtask targetIdentificationSubtask =MapstructUtils.convert(targetIdentificationSubtaskBo, TargetIdentificationSubtask. class);
+
+        this.save(targetIdentificationSubtask);//使用全局配置的雪花算法主键生成器生成ID值
+
+        return targetIdentificationSubtask;
+    }
+
     /**
      * 修改目标识别子任务
      *
@@ -126,4 +159,105 @@ public class TargetIdentificationSubtaskServiceImpl extends BaseServiceImpl<Targ
         return this.removeByIds(Arrays.asList(ids));
     }
 
+    @Override
+    public void taskRun(TargetIdentificationTask task) {
+        TargetIdentificationSubtask targetIdentificationSubtask = targetIdentificationSubtaskMapper.getAvailableSubtask(task.getId());
+        doProcess(targetIdentificationSubtask);
+    }
+
+    private void doProcess(TargetIdentificationSubtask subtask) {
+        Long algorithmId = null;
+        Long modelId = null;
+        String parameters = null;
+        String preprocessPath = null;
+        String resultPath = null;
+        String url = null;
+        StringJoiner errorMsg = null;
+
+        List<TargetIdentificationSubtaskDetailsBo> detailsList = detailsService.getTargetIdentificationSubtaskDetailsListBySubtaskId(subtask.getId());
+
+        for (TargetIdentificationSubtaskDetailsBo detail : detailsList) {
+            url = detail.getType();
+            errorMsg = new StringJoiner(System.lineSeparator());
+            algorithmId = detail.getAlgorithmId();
+            modelId = detail.getAlgorithmId();
+            parameters = detail.getParameters();
+            preprocessPath = detail.getPreprocessPath();
+            resultPath = detail.getResultPath();
+            //AlgorithmConfig config = algorithmConfigService.getById(algorithmId);
+            //if (config == null) {
+            //    log.error("算法配置未找到!!!algorithmId:{}", algorithmId);
+            //    errorMsg.add("算法配置未找到!!!");
+            //} else {
+            //    url = config.getAlgorithmAddress();
+            //}
+            //AlgorithmModel model = null;
+            //if (modelId != null) {
+            //    model = modelService.getById(modelId);
+            //}
+            // send http
+            AlgorithmRequestDto algorithmRequestDto = new AlgorithmRequestDto();
+            algorithmRequestDto.setBizType(BizConstant.TYPE_DATA_BIZ_PROCESS);
+            algorithmRequestDto.setBizId(subtask.getId());
+            algorithmRequestDto.setSourcePath(BizConstant.DOCKER_BASE_PATH + preprocessPath);
+            algorithmRequestDto.setResultPath(BizConstant.DOCKER_BASE_PATH + resultPath);
+            algorithmRequestDto.setLogPath(BizConstant.DOCKER_BASE_PATH + resultPath);
+            Gson gson = new Gson();
+            Type listType = new TypeToken<List<AlgorithmConfigParamDto>>() {}.getType();
+            if (StringUtils.isNotEmpty(parameters)) {
+                List<AlgorithmConfigParamDto> paramDtoList = gson.fromJson(parameters, listType);
+                Map<String, Object> otherParams = new HashMap<>(paramDtoList.size());
+                //if (model == null) {
+                //    log.error("模型配置未找到!!!modelId:{}", modelId);
+                //    errorMsg.add("模型配置未找到!!!");
+                //    // 找到训练的模型地址
+                //    String trainModelPath = mapper.getTrainModelPath(subtask.getId());
+                //    if (StringUtils.isNotEmpty(trainModelPath)){
+                //        otherParams.put("weight_path", BizConstant.DOCKER_BASE_PATH + trainModelPath + BizConstant.DOCKER_PT_PATH);
+                //    }
+                //} else {
+                //    SysOssVo modelOss = ossService.getById(Long.valueOf(model.getModelAddress()));
+                //    otherParams.put("pretrained_model", BizConstant.DOCKER_BASE_PATH + StringUtils.substringAfter(modelOss.getFileName(), Constants.RESOURCE_PREFIX));
+                //}
+                for (AlgorithmConfigParamDto algorithmConfigParamDto : paramDtoList) {
+                    String value = StringUtils.isNotEmpty(algorithmConfigParamDto.getValue()) ? algorithmConfigParamDto.getValue() : algorithmConfigParamDto.getDefaultValue();
+                    if(NumberUtils.isCreatable(value)){
+                        otherParams.put(algorithmConfigParamDto.getAgName(), NumberUtils.createNumber(value));
+                    } else {
+                        otherParams.put(algorithmConfigParamDto.getAgName(), value);
+                    }
+                }
+                algorithmRequestDto.setOtherParams(otherParams);
+            }
+            String httpResult = null;
+            Mono<String> response = null;
+            if (StringUtils.isEmpty(url)) {
+                errorMsg.add("url是空!!!");
+            } else {
+                log.info("http post url:{},body:{}", url,algorithmRequestDto);
+                WebClient webClient = WebClient.builder().build();
+                response = webClient.post()
+                    .uri(url)
+                    .bodyValue(algorithmRequestDto)
+                    .retrieve()
+                    .bodyToMono(String.class);
+            }
+            // process httpResult
+            log.info("httpResult:{}", httpResult);
+            // update AlgorithmBizProcess
+            TargetIdentificationSubtaskDetails algorithmBizProcess = MapstructUtils.convert(detail, TargetIdentificationSubtaskDetails.class);
+            if (errorMsg.length() != 0) {
+                algorithmBizProcess.setStatus(BizConstant.TASK_STATUS_FAILED);
+                algorithmBizProcess.setRemarks(errorMsg.toString());
+            } else {
+                algorithmBizProcess.setStatus(BizConstant.TASK_STATUS_PROCESSING);
+                algorithmBizProcess.setStartTime(new Date());
+            }
+            detailsService.updateById(algorithmBizProcess);
+            if (response != null) {
+                httpResult = response.block();
+                log.info("targetIdentificationSubtaskDetail id: {} http response {}", subtask.getId(), httpResult);
+            }
+        }
+    }
 }

+ 189 - 29
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java

@@ -1,31 +1,40 @@
 package com.taais.biz.service.impl;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Random;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.esotericsoftware.minlog.Log;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
 import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.TargetIdentificationSubtask;
 import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
 import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
 import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
 import com.taais.biz.domain.dto.task.TaskDto;
-import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
-import com.taais.biz.service.ITargetIdentificationSubtaskService;
+import com.taais.biz.domain.vo.AlgorithmModelVo;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.biz.domain.vo.DataVo;
+import com.taais.biz.service.*;
 import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.core.utils.StringUtils;
+import com.taais.common.core.utils.uuid.UUID;
 import com.taais.common.orm.core.page.PageQuery;
 import com.taais.common.core.core.page.PageResult;
 import com.taais.common.orm.core.service.impl.BaseServiceImpl;
 import jakarta.annotation.Resource;
+import org.apache.commons.io.FileUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.taais.biz.mapper.TargetIdentificationTaskMapper;
 import com.taais.biz.domain.TargetIdentificationTask;
 import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
 import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
-import com.taais.biz.service.ITargetIdentificationTaskService;
+
 import static com.taais.biz.domain.table.TargetIdentificationTaskTableDef.TARGET_IDENTIFICATION_TASK;
 
 /**
@@ -44,6 +53,12 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
     @Resource
     private ITargetIdentificationSubtaskDetailsService subtaskDetailsService;
 
+    @Resource
+    private IAlgorithmTaskConfigurationService algorithmTaskConfigurationService;
+
+    @Resource
+    private DataServiceImpl dataService;
+
     @Override
     public QueryWrapper query() {
         return super.query().from(TARGET_IDENTIFICATION_TASK);
@@ -106,8 +121,23 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
     @Override
     public boolean insert(TargetIdentificationTaskBo targetIdentificationTaskBo) {
     TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
+        System.out.println("Insert task: " + targetIdentificationTask);
+
+        boolean result = this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
+
+        System.out.println("Insert task: " + targetIdentificationTask);
 
-        return this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
+        return result;
+    }
+
+    public TargetIdentificationTask insertTask(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
+
+        boolean result = this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
+
+        System.out.println("Insert task: " + targetIdentificationTask);
+
+        return targetIdentificationTask;
     }
 
     /**
@@ -138,6 +168,15 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
         return this.removeByIds(Arrays.asList(ids));
     }
 
+    @Override
+    public void taskRun() {
+        TargetIdentificationTask task = targetIdentificationTaskMapper.getAvailableTask();
+        if (task == null) {
+            return;
+        }
+        subtaskService.taskRun(task);
+    }
+
     @Override
     @Transactional
     public String createTask(CreateTargetIdentificationTaskDto taskDto) {
@@ -152,8 +191,9 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
         TargetIdentificationTaskBo taskBo = new TargetIdentificationTaskBo();
         taskBo.setName(taskDto.getTaskName());
         taskBo.setStatus(BizConstant.TASK_STATUS_PENDING);
-        // todo 确保保存后有id
-        this.insert(taskBo);
+        TargetIdentificationTask task = this.insertTask(taskBo);
+        taskBo.setId(task.getId());
+        System.out.println("taskBo is: " + taskBo);
 
         // 创建训练子任务
         if(taskDto.getTaskItemList().contains(CreateTargetIdentificationTaskDto.TASK_TYPE_SINGLE_DATA_AND_MORE_ALGORITHM)){
@@ -166,47 +206,167 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
         return null;
     }
 
-    private void createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+    private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
         List<TaskDto> algTaskList = taskDto.getAlgTaskList();
-        List<String> testBatchNumList = taskDto.getTestBatchNumList();
+        List<String> trainBatchNumList = taskDto.getTrainBatchNumList();
+        if (trainBatchNumList.isEmpty()) {
+            return;
+        }
         TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
-        subtask.setName("测试");
+        subtask.setName("训练");
         subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
         subtask.setTaskId(taskId);
-        // todo set others params
-
-        // todo 保证有主键id
+        subtask.setRemarks("DEFAULT_REMARK");
 
-        subtaskService.insert(subtask);
+        TargetIdentificationSubtask savedTask = subtaskService.insertSubtask(subtask);
+        subtask.setId(savedTask.getId());
+        System.out.println("subtask is: " + subtask);
 
         for (TaskDto algTask : algTaskList) {
             // 通过算法id 获取算法配置
             Long algorithmId = algTask.getAlgorithmId();
-            // todo
-            String algUrl = "";
-            String algName = "";
-            // algConfig = xxxService.getById(algorithmId)
-            // alg algUrl = algConfig.getTestUrl()
-            // alg algName = algConfig.getName()
-
-            for (String batchNum : testBatchNumList) {
-                createSubTaskDetails(subtask, algUrl,algName, algTask, testBatchNumList);
+            AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
+
+            String algUrl = algorithmModelVo.getTestUrl();
+            String algName = algorithmModelVo.getName();
+            List<String> params = List.of(algTask.getParams().split(";;;"));
+
+            for (int i = 0; i < trainBatchNumList.size(); i++) {
+                String batchNum = trainBatchNumList.get(i);
+                TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
+                // 通过算法id获取算法配置
+                subtaskDetail.setSubtaskId(subtask.getId());
+                subtaskDetail.setName(algName);
+                subtaskDetail.setStatus(BizConstant.TASK_STATUS_PENDING);
+                subtaskDetail.setAlgorithmId(algTask.getAlgorithmId());
+                subtaskDetail.setType(algUrl);
+                subtaskDetail.setDataBatchNums(batchNum);
+                subtaskDetail.setParameters(params.get(0));
+                // todo 获取预处理路径
+                String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                subtaskDetail.setPreprocessPath(subtaskPath);
+                subtaskDetail.setResultPath(subtaskPath + "/result");
+                subtaskDetail.setIndex((long) i);
+                copyFilesToPath(batchNum, subtaskPath);
+
+                subtaskDetailsService.insert(subtaskDetail);
             }
         }
     }
 
-    private void createSubTaskDetails(TargetIdentificationSubtaskBo subtask, String algUrl, String algName, TaskDto algTask, List<String> testBatchNumList) {
-        //
-        TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
-        // 通过算法id获取算法配置
-        subtaskDetail.setName(algName);
-        subtaskDetailsService.insert(subtaskDetail);
+    public static final String PATH_PREFIX = "ObjectDetection_Web/task";
+    /**
+     * 移动文件到对应文件夹
+     * @param batch
+     * @param path
+     */
+    private void copyFilesToPath(String batch, String path) {
+        String[] batches = batch.split(",");
+
+        File dir = new File(PATH_PREFIX + path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        dir = new File(PATH_PREFIX + path + "/images");
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        dir = new File(PATH_PREFIX + path + "/labels");
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        dir = new File(PATH_PREFIX + path + "/result");
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        System.out.println(dir.getAbsolutePath());
+
+        for (String batchNum : batches) {
+            List<DataVo> dataVoList = dataService.getDataByBatchNum(batchNum);
+            for (DataVo dataVo : dataVoList) {
+                String[] strings = dataVo.getUrl().split("/profile");
+                String relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                File file = new File(relativePath);
+                System.out.println(file.getAbsolutePath());
+                if (file.exists()) {
+                    try {
+                        File dist = new File(PATH_PREFIX + path + "/images/" + file.getName());
+                        FileUtils.copyFile(file, dist);
+                        System.out.println("file dist: " + dist.getAbsolutePath());
+                    } catch (IOException e) {
+                        Log.debug("bug found");
+                        continue;
+                    }
+                }
+                if (dataVo.getLabelurl() != null) {
+                    strings = dataVo.getLabelurl().split("/profile");
+                    relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                    file = new File(relativePath);
+                    if (file.exists()) {
+                        try {
+                            File dist = new File(PATH_PREFIX + path + "/labels/" + file.getName());
+                            FileUtils.copyFile(file, dist);
+                            System.out.println("file dist: " + dist.getAbsolutePath());
+                        } catch (IOException e) {
+                            Log.debug("bug found");
+                            continue;
+                        }
+                    }
+                }
+            }
+        }
     }
 
-    private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+    private void createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+        List<TaskDto> algTaskList = taskDto.getAlgTaskList();
+        List<String> testBatchNumList = taskDto.getTestBatchNumList();
+        if (testBatchNumList.isEmpty()) {
+            return;
+        }
+        TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
+        subtask.setName("测试");
+        subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
+        subtask.setTaskId(taskId);
+        subtask.setRemarks("DEFAULT_REMARK");
+
+        TargetIdentificationSubtask savedTask = subtaskService.insertSubtask(subtask);
+        subtask.setId(savedTask.getId());
+        System.out.println("subtask is: " + subtask);
+
+        for (TaskDto algTask : algTaskList) {
+            // 通过算法id 获取算法配置
+            Long algorithmId = algTask.getAlgorithmId();
+            AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
+
+            String algUrl = algorithmModelVo.getTestUrl();
+            String algName = algorithmModelVo.getName();
+            List<String> params = List.of(algTask.getParams().split(";;;"));
+
+            for (int i = 0; i < testBatchNumList.size(); i++) {
+                String batchNum = testBatchNumList.get(i);
+                TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
+                // 通过算法id获取算法配置
+                subtaskDetail.setSubtaskId(subtask.getId());
+                subtaskDetail.setName(algName);
+                subtaskDetail.setStatus(BizConstant.TASK_STATUS_PENDING);
+                subtaskDetail.setAlgorithmId(algTask.getAlgorithmId());
+                subtaskDetail.setType(algUrl);
+                subtaskDetail.setDataBatchNums(batchNum);
+                subtaskDetail.setParameters(params.get(2));
+                // todo 获取预处理路径
+                String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                subtaskDetail.setPreprocessPath(subtaskPath);
+                subtaskDetail.setResultPath(subtaskPath + "/result");
+                subtaskDetail.setIndex((long) i);
+                copyFilesToPath(batchNum, subtaskPath);
 
+                subtaskDetailsService.insert(subtaskDetail);
+            }
+        }
     }
 
+
     // todo 检查数据是否有问题
     private String checkTask(CreateTargetIdentificationTaskDto taskDto) {
         return null;

+ 3 - 0
taais-modules/taais-biz/src/main/resources/mapper/ag/AlgorithmModelMapper.xml

@@ -10,4 +10,7 @@
         || '-' ||
         (select ac.algorithm_name from algorithm_config ac where ac.id = #{algorithmId} limit 1)
     </select>
+    <select id="getModelByAlgorithmId" resultType="com.taais.biz.domain.vo.AlgorithmModelVo">
+        select * from algorithm_model am where am.algorithm_id = #{algorithmId}
+    </select>
 </mapper>

+ 4 - 0
taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskDetailsMapper.xml

@@ -4,4 +4,8 @@
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.taais.biz.mapper.TargetIdentificationSubtaskDetailsMapper">
 
+    <select id="getTargetIdentificationSubtaskDetailsListBySubtaskId"
+            resultType="com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo">
+        select * from target_identification_subtask_details where subtask_id = #{subtaskId}
+    </select>
 </mapper>

+ 11 - 0
taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskMapper.xml

@@ -4,4 +4,15 @@
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.taais.biz.mapper.TargetIdentificationSubtaskMapper">
 
+    <select id="getAvailableSubtask" resultType="com.taais.biz.domain.TargetIdentificationSubtask">
+        SELECT
+            *
+        FROM
+            target_identification_subtask t
+        WHERE
+            t.status = '0' and t.task_id = #{taskId}
+        ORDER BY
+            t.create_time DESC
+        LIMIT 1
+    </select>
 </mapper>

+ 11 - 0
taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationTaskMapper.xml

@@ -4,4 +4,15 @@
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.taais.biz.mapper.TargetIdentificationTaskMapper">
 
+    <select id="getAvailableTask" resultType="com.taais.biz.domain.TargetIdentificationTask">
+        SELECT
+            *
+        FROM
+            target_identification_task t
+        WHERE
+            t.status = '0'
+        ORDER BY
+            t.create_time DESC
+        LIMIT 1
+    </select>
 </mapper>