allen 1 жил өмнө
parent
commit
34c1535c37
30 өөрчлөгдсөн 1184 нэмэгдсэн , 98 устгасан
  1. 280 28
      script/sql/postgresql/data(postgresql).sql
  2. 23 0
      taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/FileUtils.java
  3. 4 0
      taais-modules/taais-biz/pom.xml
  4. 47 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/constant/BizConstant.java
  5. 1 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmSubtaskController.java
  6. 17 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmTaskController.java
  7. 9 3
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmSubtask.java
  8. 1 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmSubtaskDetail.java
  9. 3 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/Data.java
  10. 13 6
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/AlgorithmSubtaskBo.java
  11. 5 3
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/DataBo.java
  12. 15 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/AlgorithmRequestDto.java
  13. 0 4
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/createTaskDto.java
  14. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/AlgorithmSubtaskParamDto.java
  15. 43 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTaskDto.java
  16. 13 5
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmSubtaskImportVo.java
  17. 13 5
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmSubtaskVo.java
  18. 5 3
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataVo.java
  19. 2 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmSubtaskMapper.java
  20. 1 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmTaskMapper.java
  21. 3 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmSubtaskService.java
  22. 13 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmTaskService.java
  23. 7 6
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java
  24. 92 13
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmSubtaskServiceImpl.java
  25. 523 13
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmTaskServiceImpl.java
  26. 9 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
  27. 4 0
      taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmSubtaskMapper.xml
  28. 3 1
      taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmTaskMapper.xml
  29. 2 0
      taais-modules/taais-system/src/main/java/com/taais/system/service/ISysDictDataService.java
  30. 17 0
      taais-modules/taais-system/src/main/java/com/taais/system/service/impl/SysDictDataServiceImpl.java

+ 280 - 28
script/sql/postgresql/data(postgresql).sql

@@ -16,6 +16,7 @@ CREATE TABLE IF NOT EXISTS public.data
     gather_time timestamp without time zone,
     gather_spot character varying(225) COLLATE pg_catalog."default" DEFAULT ''::character varying,
     url character varying(225) COLLATE pg_catalog."default",
+    labelUrl character varying(225) COLLATE pg_catalog."default",
     increment character varying(225) COLLATE pg_catalog."default" DEFAULT ''::character varying,
     labeled boolean DEFAULT false,
     CONSTRAINT data_pkey PRIMARY KEY (id)
@@ -64,6 +65,9 @@ COMMENT ON COLUMN public.data.gather_spot
 COMMENT ON COLUMN public.data.url
     IS '图片url';
 
+COMMENT ON COLUMN public.data.labelUrl
+    IS '标注url';
+
 COMMENT ON COLUMN public.data.increment
     IS '扩增方式';
 
@@ -285,14 +289,16 @@ DROP TABLE IF EXISTS public.algorithm_subtask;
 
 CREATE TABLE "public"."algorithm_subtask" (
  "id" "pg_catalog"."int8" NOT NULL,
+ "task_id" "pg_catalog"."int8",
  "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" NOT NULL,
+ "type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" NOT NULL,
  "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" NOT NULL,
  "parameters" "pg_catalog"."text" COLLATE "pg_catalog"."default" NOT NULL,
  "start_time" "pg_catalog"."timestamp",
  "end_time" "pg_catalog"."timestamp",
  "cost_second" "pg_catalog"."int8",
  "log" "pg_catalog"."text" COLLATE "pg_catalog"."default",
- "has_details" "pg_catalog"."int8" DEFAULT 0,
+ "index" "pg_catalog"."int8" DEFAULT 0,
  "create_by" "pg_catalog"."int8",
  "create_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP,
  "update_by" "pg_catalog"."int8",
@@ -310,8 +316,12 @@ ALTER TABLE "public"."algorithm_subtask"
 
 COMMENT ON COLUMN "public"."algorithm_subtask"."id" IS '主键ID';
 
+COMMENT ON COLUMN "public"."algorithm_subtask"."task_id" IS '任务ID';
+
 COMMENT ON COLUMN "public"."algorithm_subtask"."name" IS '任务名称';
 
+COMMENT ON COLUMN "public"."algorithm_subtask"."type" IS '任务类型';
+
 COMMENT ON COLUMN "public"."algorithm_subtask"."status" IS '任务状态';
 
 COMMENT ON COLUMN "public"."algorithm_subtask"."parameters" IS '调用算法时所用的参数';
@@ -324,7 +334,7 @@ COMMENT ON COLUMN "public"."algorithm_subtask"."cost_second" IS '耗时';
 
 COMMENT ON COLUMN "public"."algorithm_subtask"."log" IS '日志';
 
-COMMENT ON COLUMN "public"."algorithm_subtask"."has_details" IS '是否包含详情';
+COMMENT ON COLUMN "public"."algorithm_subtask"."index" IS '序号';
 
 COMMENT ON COLUMN "public"."algorithm_subtask"."create_by" IS '创建人';
 
@@ -346,14 +356,21 @@ COMMENT ON COLUMN "public"."algorithm_subtask"."system" IS '系统';
 
 COMMENT ON TABLE "public"."algorithm_subtask" IS '算法子任务表';
 
--- 算法子任务详情
-DROP TABLE IF EXISTS public.algorithm_subtask_detail;
+-- 算法业务处理
+DROP TABLE IF EXISTS public.algorithm_biz_process;
 
-CREATE TABLE "public"."algorithm_subtask_detail" (
+CREATE TABLE "public"."algorithm_biz_process" (
  "id" "pg_catalog"."int8" NOT NULL,
- "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" NOT NULL,
- "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" NOT NULL,
- "parameters" "pg_catalog"."text" COLLATE "pg_catalog"."default" NOT NULL,
+ "sub_task_id" "pg_catalog"."int8" NOT NULL,
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "algorithm_id" "pg_catalog"."int8",
+ "model_id" "pg_catalog"."int8",
+ "parameters" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+ "preprocess_path" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "result_path" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "index" "pg_catalog"."int8" DEFAULT 0,
  "start_time" "pg_catalog"."timestamp",
  "end_time" "pg_catalog"."timestamp",
  "cost_second" "pg_catalog"."int8",
@@ -367,48 +384,62 @@ CREATE TABLE "public"."algorithm_subtask_detail" (
  version           integer                 DEFAULT 0,
  del_flag      smallint               DEFAULT '0'::smallint         NOT NULL,
  "system" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
- CONSTRAINT "algorithm_subtask_detail_pkey" PRIMARY KEY ("id")
+ CONSTRAINT "algorithm_biz_process_pkey" PRIMARY KEY ("id")
 );
 
 
-ALTER TABLE "public"."algorithm_subtask_detail"
+ALTER TABLE "public"."algorithm_biz_process"
     OWNER TO "postgres";
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."id" IS '主键ID';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."algorithm_biz_process"."sub_task_id" IS '子任务id';
+
+COMMENT ON COLUMN "public"."algorithm_biz_process"."name" IS '任务名称';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."name" IS '任务名称';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."type" IS '任务类型';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."status" IS '任务状态';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."status" IS '任务状态';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."parameters" IS '调用算法时所用的参数';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."algorithm_id" IS '算法';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."start_time" IS '开始时间';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."model_id" IS '模型';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."end_time" IS '结束时间';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."parameters" IS '调用算法时所用的参数';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."cost_second" IS '耗时';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."preprocess_path" IS '预处理数据路径';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."log" IS '日志';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."result_path" IS '结果数据路径';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."create_by" IS '创建人';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."index" IS '序号';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."create_time" IS '创建时间';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."start_time" IS '开始时间';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."update_by" IS '更新人';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."end_time" IS '结束时间';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."update_time" IS '更新时间';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."cost_second" IS '耗时';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."remarks" IS '备注';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."log" IS '日志';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."version" IS '乐观锁';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."create_by" IS '创建人';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."tenant_id" IS '租户编码';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."create_time" IS '创建时间';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."update_by" IS '更新人';
 
-COMMENT ON COLUMN "public"."algorithm_subtask_detail"."system" IS '系统';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."update_time" IS '更新时间';
 
-COMMENT ON TABLE "public"."algorithm_subtask_detail" IS '算法子任务详情表';
+COMMENT ON COLUMN "public"."algorithm_biz_process"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."algorithm_biz_process"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."algorithm_biz_process"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."algorithm_biz_process"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON COLUMN "public"."algorithm_biz_process"."system" IS '系统';
+
+COMMENT ON TABLE "public"."algorithm_biz_process" IS '算法业务处理表';
 
 
 -- 菜单 SQL
@@ -495,3 +526,224 @@ insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component,
 values(2024052914210305, '算法子任务详情导出', 2024052914210400, '5',  '', '', 1, 0, 'F', '0', '0', 'task:subtaskDetail:export',       '', 1, now(), 1, null, '');
 
 
+-- 2024/6/11 添加
+
+-- 算法数据集合表
+DROP TABLE IF EXISTS public.algorithm_data_set;
+
+CREATE TABLE "public"."algorithm_data_set" (
+ "id" "pg_catalog"."int8" NOT NULL,
+ "sub_task_id" "pg_catalog"."int8" NOT NULL,
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "parameters" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+ "result_path" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "index" "pg_catalog"."int8" DEFAULT 0,
+ "start_time" "pg_catalog"."timestamp",
+ "end_time" "pg_catalog"."timestamp",
+ "cost_second" "pg_catalog"."int8",
+ "log" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+ "create_by" "pg_catalog"."int8",
+ "create_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP,
+ "update_by" "pg_catalog"."int8",
+ "update_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP,
+ "remarks" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" DEFAULT NULL::character varying,
+ "tenant_id" "pg_catalog"."int8" DEFAULT 0,
+ version           integer                 DEFAULT 0,
+ del_flag      smallint               DEFAULT '0'::smallint         NOT NULL,
+ "system" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ CONSTRAINT "algorithm_data_set_pkey" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."algorithm_data_set"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."sub_task_id" IS '子任务id';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."type" IS '任务类型';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."parameters" IS '调用算法时所用的参数';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."result_path" IS '结果数据路径';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."index" IS '序号';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."start_time" IS '开始时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."end_time" IS '结束时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."cost_second" IS '耗时';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."log" IS '日志';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON COLUMN "public"."algorithm_data_set"."system" IS '系统';
+
+COMMENT ON TABLE "public"."algorithm_data_set" IS '算法数据集合表';
+
+
+-- 算法数据处理表
+DROP TABLE IF EXISTS public.algorithm_data_process;
+
+CREATE TABLE "public"."algorithm_data_process" (
+ "id" "pg_catalog"."int8" NOT NULL,
+ "sub_task_id" "pg_catalog"."int8" NOT NULL,
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "algorithm_id" "pg_catalog"."int8",
+ "parameters" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+ "preprocess_path" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "result_path" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "index" "pg_catalog"."int8" DEFAULT 0,
+ "start_time" "pg_catalog"."timestamp",
+ "end_time" "pg_catalog"."timestamp",
+ "cost_second" "pg_catalog"."int8",
+ "log" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+ "create_by" "pg_catalog"."int8",
+ "create_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP,
+ "update_by" "pg_catalog"."int8",
+ "update_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP,
+ "remarks" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" DEFAULT NULL::character varying,
+ "tenant_id" "pg_catalog"."int8" DEFAULT 0,
+ version           integer                 DEFAULT 0,
+ del_flag      smallint               DEFAULT '0'::smallint         NOT NULL,
+ "system" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ CONSTRAINT "algorithm_data_process_pkey" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."algorithm_data_process"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."sub_task_id" IS '子任务id';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."type" IS '任务类型';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."algorithm_id" IS '算法';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."parameters" IS '调用算法时所用的参数';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."preprocess_path" IS '预处理数据路径';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."result_path" IS '结果数据路径';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."index" IS '序号';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."start_time" IS '开始时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."end_time" IS '结束时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."cost_second" IS '耗时';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."log" IS '日志';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON COLUMN "public"."algorithm_data_process"."system" IS '系统';
+
+COMMENT ON TABLE "public"."algorithm_data_process" IS '算法数据处理表';
+
+
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115343900, '算法业务处理', 153308760386924544, '1', 'bizProcess', 'task/bizProcess/index', 1, 0, 'C', '0', '0', 'task:bizProcess:list', '', 1, now(), 1, null, '算法业务处理菜单');
+
+-- 按钮 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115343901, '算法业务处理查询', 2024061115343900, '1',  '', '', 1, 0, 'F', '0', '0', 'task:bizProcess:query',        '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115343902, '算法业务处理新增', 2024061115343900, '2',  '', '', 1, 0, 'F', '0', '0', 'task:bizProcess:add',          '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115343903, '算法业务处理修改', 2024061115343900, '3',  '', '', 1, 0, 'F', '0', '0', 'task:bizProcess:edit',         '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115343904, '算法业务处理删除', 2024061115343900, '4',  '', '', 1, 0, 'F', '0', '0', 'task:bizProcess:remove',       '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115343905, '算法业务处理导出', 2024061115343900, '5',  '', '', 1, 0, 'F', '0', '0', 'task:bizProcess:export',       '', 1, now(), 1, null, '');
+
+
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344000, '算法数据处理', 153308760386924544, '1', 'dataProcess', 'task/dataProcess/index', 1, 0, 'C', '0', '0', 'task:dataProcess:list', '', 1, now(), 1, null, '算法数据处理菜单');
+
+-- 按钮 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344001, '算法数据处理查询', 2024061115344000, '1',  '', '', 1, 0, 'F', '0', '0', 'task:dataProcess:query',        '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344002, '算法数据处理新增', 2024061115344000, '2',  '', '', 1, 0, 'F', '0', '0', 'task:dataProcess:add',          '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344003, '算法数据处理修改', 2024061115344000, '3',  '', '', 1, 0, 'F', '0', '0', 'task:dataProcess:edit',         '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344004, '算法数据处理删除', 2024061115344000, '4',  '', '', 1, 0, 'F', '0', '0', 'task:dataProcess:remove',       '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344005, '算法数据处理导出', 2024061115344000, '5',  '', '', 1, 0, 'F', '0', '0', 'task:dataProcess:export',       '', 1, now(), 1, null, '');
+
+
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344100, '算法数据集合', 153308760386924544, '1', 'dataSet', 'task/dataSet/index', 1, 0, 'C', '0', '0', 'task:dataSet:list', '', 1, now(), 1, null, '算法数据集合菜单');
+
+-- 按钮 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344101, '算法数据集合查询', 2024061115344100, '1',  '', '', 1, 0, 'F', '0', '0', 'task:dataSet:query',        '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344102, '算法数据集合新增', 2024061115344100, '2',  '', '', 1, 0, 'F', '0', '0', 'task:dataSet:add',          '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344103, '算法数据集合修改', 2024061115344100, '3',  '', '', 1, 0, 'F', '0', '0', 'task:dataSet:edit',         '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344104, '算法数据集合删除', 2024061115344100, '4',  '', '', 1, 0, 'F', '0', '0', 'task:dataSet:remove',       '', 1, now(), 1, null, '');
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(2024061115344105, '算法数据集合导出', 2024061115344100, '5',  '', '', 1, 0, 'F', '0', '0', 'task:dataSet:export',       '', 1, now(), 1, null, '');

+ 23 - 0
taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/FileUtils.java

@@ -22,6 +22,10 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 
 /**
  * 文件处理工具类
@@ -252,4 +256,23 @@ public class FileUtils extends FileUtil {
         String baseName = FilenameUtils.getBaseName(fileName);
         return baseName;
     }
+
+    public static void copyFile(String source, String target) throws IOException {
+        // 源文件路径
+        Path sourcePath = Paths.get(source);
+
+        // 目标文件夹路径
+        Path targetDirectory = Paths.get(target);
+
+        // 如果目标文件夹不存在,创建它
+        if (!Files.exists(targetDirectory)) {
+            Files.createDirectories(targetDirectory);
+        }
+
+        // 目标文件路径
+        Path targetPath = targetDirectory.resolve(sourcePath.getFileName());
+
+        // 执行文件复制
+        Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
+    }
 }

+ 4 - 0
taais-modules/taais-biz/pom.xml

@@ -45,6 +45,10 @@
             <groupId>com.taais</groupId>
             <artifactId>taais-system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 47 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/constant/BizConstant.java

@@ -0,0 +1,47 @@
+package com.taais.biz.constant;
+
+/**
+ * @author allen
+ */
+public class BizConstant {
+
+    public static final String TASK_FOLDER_PATH_HEAD = "/task/";
+
+    public static final String TASK_FOLDER_PATH_MID_TRAIN = "/train/";
+    public static final String TASK_FOLDER_PATH_MID_TEST = "/test/";
+
+    public static final String TASK_FOLDER_PATH_MID_REASONING = "/reasoning/";
+
+    public static final String TASK_FOLDER_PATH_TRAIL_ORIGINAL = "/original/";
+
+    public static final String TASK_FOLDER_PATH_TRAIL_ENHANCEMENT = "/enhancement/";
+
+    public static final String TASK_FOLDER_PATH_TRAIL_EXPANSION = "/expansion/";
+
+    public static final String TASK_FOLDER_PATH_TRAIL_RESULT= "/result/";
+
+    public static final String IMAGE = "image";
+    public static final String LABEL = "image";
+
+    public static final String STEP1_SELECT_TASK = "1";
+    public static final String STEP2_TRAIN_DATA_SELECT = "2";
+    public static final String STEP3_TRAIN_DATA_ENHANCEMENT = "3";
+    public static final String STEP4_TRAIN_DATA_EXPANSION = "4";
+    public static final String STEP5_TRAIN = "5";
+
+    public static final String STEP6_TEST_DATA_SELECT = "6";
+    public static final String STEP7_TEST_DATA_ENHANCEMENT = "7";
+    public static final String STEP8_TEST_DATA_EXPANSION = "8";
+    public static final String STEP9_TEST = "9";
+
+    public static final String STEP10_REASONING_DATA_SELECT = "10";
+    public static final String STEP11_REASONING_DATA_ENHANCEMENT = "11";
+    public static final String STEP12_REASONING_DATA_EXPANSION = "12";
+    public static final String STEP13_REASONING = "13";
+
+    // task status 要和数据字典保持一致 biz_task_status
+    public static final String TASK_STATUS_PENDING = "0";
+    public static final String TASK_STATUS_PROCESSING = "1";
+    public static final String TASK_STATUS_SUCCEED = "2";
+    public static final String TASK_STATUS_FAILED = "3";
+}

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

@@ -24,7 +24,7 @@ import com.taais.common.core.core.page.PageResult;
  * 算法子任务Controller
  *
  * @author Allen
- * 2024-05-29
+ * 2024-06-11
  */
 @Validated
 @RequiredArgsConstructor

+ 17 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmTaskController.java

@@ -2,6 +2,8 @@ package com.taais.biz.controller;
 
 import java.util.List;
 
+import com.taais.biz.domain.dto.task.CreateTaskDto;
+import com.taais.common.core.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -106,4 +108,19 @@ public class AlgorithmTaskController extends BaseController {
         }
         return CommonResult.success();
     }
+
+    /**
+     * 新增算法任务
+     */
+    @SaCheckPermission("task:task:add")
+    @Log(title = "算法任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/create")
+    public CommonResult<Void> create(@Validated @RequestBody CreateTaskDto taskDto) {
+        String string = algorithmTaskService.create(taskDto);
+        if (StringUtils.isNotEmpty(string)) {
+            return CommonResult.fail("新增算法任务记录失败!");
+        }
+        return CommonResult.success();
+    }
 }

+ 9 - 3
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmSubtask.java

@@ -15,7 +15,7 @@ import com.taais.common.orm.core.domain.BaseEntity;
  * 算法子任务对象 algorithm_subtask
  *
  * @author Allen
- * 2024-05-29
+ * 2024-06-11
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -29,12 +29,18 @@ private static final long serialVersionUID = 1L;
     @Id
     private Long id;
 
+    /** 任务ID */
+    private Long taskId;
+
     /** 任务名称 */
     private String name;
 
     /** 任务状态 */
     private String status;
 
+    /** 任务类型 */
+    private String type;
+
     /** 调用算法时所用的参数 */
     private String parameters;
 
@@ -50,8 +56,8 @@ private static final long serialVersionUID = 1L;
     /** 日志 */
     private String log;
 
-    /** 是否包含详情 */
-    private Long hasDetails;
+    /** 序号 */
+    private Long index;
 
     /** 备注 */
     private String remarks;

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

@@ -14,7 +14,7 @@ import com.taais.common.orm.core.domain.BaseEntity;
 /**
  * 算法子任务详情对象 algorithm_subtask_detail
  *
- * @author 0
+ * @author Allen
  * 2024-05-29
  */
 @Data

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

@@ -41,7 +41,6 @@ public class Data {
     private String objectSubtype;
 
     /** 批次号 */
-
     private Long batchNum;
 
     /** 场景 */
@@ -60,6 +59,9 @@ public class Data {
     /** 图片url */
     private String url;
 
+    /** 标注url */
+    private String labelurl;
+
     /** 扩增方式 */
     private String increment;
 

+ 13 - 6
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/AlgorithmSubtaskBo.java

@@ -13,17 +13,18 @@ import com.taais.common.orm.core.domain.BaseEntity;
  * 算法子任务业务对象 algorithm_subtask
  *
  * @author Allen
- * @date 2024-05-29
+ * @date 2024-06-11
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = AlgorithmSubtask.class, reverseConvertGenerate = false)
 public class AlgorithmSubtaskBo extends BaseEntity{
+
+    private Long id;
     /**
-     * 主键ID
+     * 任务ID
      */
-    @NotNull(message = "主键ID不能为空")
-    private Long id;
+    private Long taskId;
 
     /**
      * 任务名称
@@ -37,6 +38,12 @@ public class AlgorithmSubtaskBo extends BaseEntity{
     @NotBlank(message = "任务状态不能为空")
     private String status;
 
+    /**
+     * 任务类型
+     */
+    @NotBlank(message = "任务类型不能为空")
+    private String type;
+
     /**
      * 调用算法时所用的参数
      */
@@ -65,9 +72,9 @@ public class AlgorithmSubtaskBo extends BaseEntity{
     private String log;
 
     /**
-     * 是否包含详情
+     * 序号
      */
-    private Long hasDetails;
+    private Long index;
 
 
 }

+ 5 - 3
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/DataBo.java

@@ -57,7 +57,6 @@ public class DataBo {
     /**
      * 批次号
      */
-//    @NotNull(message = "批次号不能为空")
     private Long batchNum;
 
     /**
@@ -88,9 +87,13 @@ public class DataBo {
     /**
      * 图片url
      */
-//    @NotBlank(message = "图片url不能为空")
     private String url;
 
+    /**
+     * 标注url
+     */
+    private String labelurl;
+
     /**
      * 扩增方式
      */
@@ -100,7 +103,6 @@ public class DataBo {
     /**
      * 是否标注
      */
-
     private Boolean labeled;
 
 

+ 15 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/AlgorithmRequestDto.java

@@ -0,0 +1,15 @@
+package com.taais.biz.domain.dto;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * @author allen
+ */
+@Data
+public class AlgorithmRequestDto {
+    private String sourcePath;
+    private String resultPath;
+    private Map<String,Object> otherParams;
+}

+ 0 - 4
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/createTaskDto.java

@@ -1,4 +0,0 @@
-package com.taais.biz.domain.dto;
-
-public class createTaskDto {
-}

+ 16 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/AlgorithmSubtaskParamDto.java

@@ -0,0 +1,16 @@
+package com.taais.biz.domain.dto.task;
+
+import com.taais.biz.domain.dto.AlgorithmConfigParamDto;
+import lombok.Data;
+
+/**
+ * @author allen
+ */
+@Data
+public class AlgorithmSubtaskParamDto {
+    public String sourcePath;
+
+    public String resultPath;
+
+    public AlgorithmConfigParamDto otherParams;
+}

+ 43 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTaskDto.java

@@ -0,0 +1,43 @@
+package com.taais.biz.domain.dto.task;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author allen
+ */
+@Data
+public class CreateTaskDto {
+
+    private String taskId;
+
+    private String taskName;
+
+    private List<String> selectTask;
+
+    private List<DataSelectDto> trainDataSelect;
+
+    private TaskDto trainDataEnhancement;
+
+    private TaskDto trainDataExpansion;
+
+    private List<TaskDto> train;
+
+    private List<DataSelectDto> testDataSelect;
+
+    private TaskDto testDataEnhancement;
+
+    private TaskDto testDataExpansion;
+
+    private List<TaskDto> test;
+
+    private List<DataSelectDto> reasoningDataSelect;
+
+    private TaskDto reasoningDataEnhancement;
+
+    private TaskDto reasoningDataExpansion;
+
+    private List<TaskDto> reasoning;
+
+}

+ 13 - 5
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmSubtaskImportVo.java

@@ -14,7 +14,7 @@ import lombok.NoArgsConstructor;
  * 算法子任务导入视图对象 algorithm_subtask
  *
  * @author Allen
- * @date 2024-05-29
+ * @date 2024-06-11
  */
 
 @Data
@@ -26,15 +26,23 @@ public class AlgorithmSubtaskImportVo implements Serializable
     private static final long serialVersionUID = 1L;
 
 
+     /** 任务ID */
+    @ExcelProperty(value = "任务ID")
+    private Long taskId;
+
      /** 任务名称 */
     @ExcelProperty(value = "任务名称")
     private String name;
 
      /** 任务状态 */
     @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(dictType = "biz_ag_type")
+    @ExcelDictFormat(dictType = "biz_task_status")
     private String status;
 
+     /** 任务类型 */
+    @ExcelProperty(value = "任务类型")
+    private String type;
+
      /** 调用算法时所用的参数 */
     @ExcelProperty(value = "调用算法时所用的参数")
     private String parameters;
@@ -55,9 +63,9 @@ public class AlgorithmSubtaskImportVo implements Serializable
     @ExcelProperty(value = "日志")
     private String log;
 
-     /** 是否包含详情 */
-    @ExcelProperty(value = "是否包含详情")
-    private Long hasDetails;
+     /** 序号 */
+    @ExcelProperty(value = "序号")
+    private Long index;
 
      /** 备注 */
     @ExcelProperty(value = "备注")

+ 13 - 5
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmSubtaskVo.java

@@ -18,7 +18,7 @@ import com.taais.common.orm.core.domain.BaseEntity;
  * 算法子任务视图对象 algorithm_subtask
  *
  * @author Allen
- * @date 2024-05-29
+ * @date 2024-06-11
  */
 @Data
 @ExcelIgnoreUnannotated
@@ -33,15 +33,23 @@ private static final long serialVersionUID = 1L;
     @ExcelProperty(value = "主键ID")
     private Long id;
 
+    /** 任务ID */
+    @ExcelProperty(value = "任务ID")
+    private Long taskId;
+
     /** 任务名称 */
     @ExcelProperty(value = "任务名称")
     private String name;
 
     /** 任务状态 */
     @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(dictType = "biz_ag_type")
+    @ExcelDictFormat(dictType = "biz_task_status")
     private String status;
 
+    /** 任务类型 */
+    @ExcelProperty(value = "任务类型")
+    private String type;
+
     /** 调用算法时所用的参数 */
     @ExcelProperty(value = "调用算法时所用的参数")
     private String parameters;
@@ -62,9 +70,9 @@ private static final long serialVersionUID = 1L;
     @ExcelProperty(value = "日志")
     private String log;
 
-    /** 是否包含详情 */
-    @ExcelProperty(value = "是否包含详情")
-    private Long hasDetails;
+    /** 序号 */
+    @ExcelProperty(value = "序号")
+    private Long index;
 
     /** 备注 */
     @ExcelProperty(value = "备注")

+ 5 - 3
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataVo.java

@@ -50,8 +50,6 @@ public class DataVo  implements Serializable {
     private String objectSubtype;
 
     /** 批次号 */
-//    @ExcelProperty(value = "批次号")
-
     private Long batchNum;
 
     /** 场景 */
@@ -72,9 +70,13 @@ public class DataVo  implements Serializable {
     private String gatherSpot;
 
     /** 图片url */
-//    @ExcelProperty(value = "url")
+    @ExcelProperty(value = "图片url")
     private String url;
 
+    /** 标注url */
+    @ExcelProperty(value = "标注url")
+    private String labelurl;
+
     /** 扩增方式 */
     @ExcelProperty(value = "扩增方式")
     private String increment;

+ 2 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmSubtaskMapper.java

@@ -8,9 +8,9 @@ import com.taais.biz.domain.AlgorithmSubtask;
  * 算法子任务Mapper接口
  *
  * @author Allen
- * 2024-05-29
+ * 2024-06-11
  */
 @Mapper
 public interface AlgorithmSubtaskMapper extends BaseMapper<AlgorithmSubtask> {
-
+    AlgorithmSubtask getFirstNeedProcessSubtask(Long taskId);
 }

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

@@ -13,4 +13,5 @@ import com.taais.biz.domain.AlgorithmTask;
 @Mapper
 public interface AlgorithmTaskMapper extends BaseMapper<AlgorithmTask> {
 
+    AlgorithmTask getLastTask();
 }

+ 3 - 1
taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmSubtaskService.java

@@ -12,7 +12,7 @@ import com.taais.common.core.core.page.PageResult;
  * 算法子任务Service接口
  *
  * @author Allen
- * 2024-05-29
+ * 2024-06-11
  */
 public interface IAlgorithmSubtaskService extends IBaseService<AlgorithmSubtask> {
     /**
@@ -63,4 +63,6 @@ public interface IAlgorithmSubtaskService extends IBaseService<AlgorithmSubtask>
      */
     boolean deleteByIds(Long[] ids);
 
+    void subtaskRun(Long taskId);
+
 }

+ 13 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmTaskService.java

@@ -3,6 +3,7 @@ package com.taais.biz.service;
 import java.util.List;
 
 import com.taais.biz.domain.AlgorithmTask;
+import com.taais.biz.domain.dto.task.CreateTaskDto;
 import com.taais.biz.domain.vo.AlgorithmTaskVo;
 import com.taais.biz.domain.bo.AlgorithmTaskBo;
 import com.taais.common.orm.core.service.IBaseService;
@@ -11,17 +12,18 @@ import com.taais.common.core.core.page.PageResult;
 /**
  * 算法任务Service接口
  *
- * @author 0
+ * @author Allen
  * 2024-05-29
  */
 public interface IAlgorithmTaskService extends IBaseService<AlgorithmTask> {
+
     /**
      * 查询算法任务
      *
      * @param id 算法任务主键
      * @return 算法任务
      */
-        AlgorithmTaskVo selectById(Long id);
+    AlgorithmTaskVo selectById(Long id);
 
     /**
      * 查询算法任务列表
@@ -63,4 +65,13 @@ public interface IAlgorithmTaskService extends IBaseService<AlgorithmTask> {
      */
     boolean deleteByIds(Long[] ids);
 
+    /**
+     * 新增算法任务
+     *
+     * @param taskDto 算法任务Dto
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    String create(CreateTaskDto taskDto);
+
+    void taskRun();
 }

+ 7 - 6
taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java

@@ -1,18 +1,18 @@
 package com.taais.biz.service;
 
-import com.taais.common.core.core.page.PageResult;
-import com.taais.common.orm.core.service.IBaseService;
+import java.util.List;
+
 import com.taais.biz.domain.Data;
-import com.taais.biz.domain.bo.DataBo;
 import com.taais.biz.domain.vo.DataVo;
-
-import java.util.List;
+import com.taais.biz.domain.bo.DataBo;
+import com.taais.common.orm.core.service.IBaseService;
+import com.taais.common.core.core.page.PageResult;
 
 /**
  * 数据管理Service接口
  *
  * @author km
- * 2024-04-22
+ * 2024-06-14
  */
 public interface IDataService extends IBaseService<Data> {
     /**
@@ -63,4 +63,5 @@ public interface IDataService extends IBaseService<Data> {
      */
     boolean deleteByIds(Long[] ids);
 
+    List<Data> selectByIds(List<Long> ids);
 }

+ 92 - 13
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmSubtaskServiceImpl.java

@@ -1,36 +1,56 @@
 package com.taais.biz.service.impl;
 
-import java.util.Arrays;
-import java.util.List;
-
 import cn.hutool.core.util.ObjectUtil;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.domain.AlgorithmBizProcess;
+import com.taais.biz.domain.AlgorithmConfig;
+import com.taais.biz.domain.AlgorithmDataProcess;
+import com.taais.biz.domain.AlgorithmSubtask;
+import com.taais.biz.domain.bo.AlgorithmSubtaskBo;
+import com.taais.biz.domain.vo.AlgorithmBizProcessVo;
+import com.taais.biz.domain.vo.AlgorithmDataProcessVo;
+import com.taais.biz.domain.vo.AlgorithmDataSetVo;
+import com.taais.biz.domain.vo.AlgorithmSubtaskVo;
+import com.taais.biz.mapper.AlgorithmSubtaskMapper;
+import com.taais.biz.service.*;
+import com.taais.common.core.core.page.PageResult;
 import com.taais.common.core.utils.MapstructUtils;
-import com.taais.common.core.utils.StringUtils;
+import com.taais.common.core.utils.http.HttpUtils;
 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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.taais.biz.mapper.AlgorithmSubtaskMapper;
-import com.taais.biz.domain.AlgorithmSubtask;
-import com.taais.biz.domain.bo.AlgorithmSubtaskBo;
-import com.taais.biz.domain.vo.AlgorithmSubtaskVo;
-import com.taais.biz.service.IAlgorithmSubtaskService;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
 import static com.taais.biz.domain.table.AlgorithmSubtaskTableDef.ALGORITHM_SUBTASK;
 
 /**
  * 算法子任务Service业务层处理
  *
  * @author Allen
- * 2024-05-29
+ * 2024-06-11
  */
 @Service
 public class AlgorithmSubtaskServiceImpl extends BaseServiceImpl<AlgorithmSubtaskMapper, AlgorithmSubtask> implements IAlgorithmSubtaskService {
+
+    private static final Logger log = LoggerFactory.getLogger(AlgorithmSubtaskServiceImpl.class);
     @Resource
     private AlgorithmSubtaskMapper algorithmSubtaskMapper;
+    @Resource
+    private IAlgorithmDataSetService dataSetService;
+    @Resource
+    private IAlgorithmDataProcessService dataProcessService;
+    @Resource
+    private IAlgorithmBizProcessService bizProcessService;
+    @Resource
+    private IAlgorithmConfigService algorithmConfigService;
 
     @Override
     public QueryWrapper query() {
@@ -43,6 +63,12 @@ public class AlgorithmSubtaskServiceImpl extends BaseServiceImpl<AlgorithmSubtas
         (algorithmSubtaskBo.getName()));
         queryWrapper.and(ALGORITHM_SUBTASK.STATUS.eq
         (algorithmSubtaskBo.getStatus()));
+        queryWrapper.and(ALGORITHM_SUBTASK.TYPE.eq
+        (algorithmSubtaskBo.getType()));
+        queryWrapper.and(ALGORITHM_SUBTASK.START_TIME.eq
+        (algorithmSubtaskBo.getStartTime()));
+        queryWrapper.and(ALGORITHM_SUBTASK.END_TIME.eq
+        (algorithmSubtaskBo.getEndTime()));
 
         return queryWrapper;
     }
@@ -107,8 +133,7 @@ public class AlgorithmSubtaskServiceImpl extends BaseServiceImpl<AlgorithmSubtas
     public boolean update(AlgorithmSubtaskBo algorithmSubtaskBo) {
         AlgorithmSubtask algorithmSubtask =MapstructUtils.convert(algorithmSubtaskBo, AlgorithmSubtask. class);
         if (ObjectUtil.isNotNull(algorithmSubtask) && ObjectUtil.isNotNull(algorithmSubtask.getId())){
-            boolean updated = this.updateById(algorithmSubtask);
-                return updated;
+            return this.updateById(algorithmSubtask);
         }
         return false;
     }
@@ -125,4 +150,58 @@ public class AlgorithmSubtaskServiceImpl extends BaseServiceImpl<AlgorithmSubtas
         return this.removeByIds(Arrays.asList(ids));
     }
 
+    @Override
+    public void subtaskRun(Long taskId) {
+        AlgorithmSubtask firstNeedProcessSubtask = algorithmSubtaskMapper.getFirstNeedProcessSubtask(taskId);
+        if (firstNeedProcessSubtask != null) {
+            // 数据增强
+            if ("1".equals(firstNeedProcessSubtask.getType())) {
+                List<AlgorithmDataProcessVo> processVoList =  dataProcessService.getProcessBySubtaskId(firstNeedProcessSubtask.getId());
+                dateSetProcess(processVoList);
+            // 数据扩充
+            } else if ("2".equals(firstNeedProcessSubtask.getType())) {
+                List<AlgorithmDataProcessVo> processVoList =  dataProcessService.getProcessBySubtaskId(firstNeedProcessSubtask.getId());
+                dateSetProcess(processVoList);
+            // 算法调用
+            } else if ("3".equals(firstNeedProcessSubtask.getType())) {
+            // error branch
+                List<AlgorithmBizProcessVo> bizProcessVoList = bizProcessService.getProcessBySubtaskId(firstNeedProcessSubtask.getId());
+                bizProcess(bizProcessVoList);
+            } else {
+                log.warn("type is wrong, type: {}", firstNeedProcessSubtask.getType());
+            }
+        } else {
+            log.error("subtaskRun.getFirstNeedProcessSubtask is null, taskId:{}", taskId);
+        }
+    }
+
+    private void bizProcess(List<AlgorithmBizProcessVo> bizProcessVoList) {
+        for (AlgorithmBizProcessVo bizProcessVo : bizProcessVoList) {
+            Long algorithmId = bizProcessVo.getAlgorithmId();
+            String parameters = bizProcessVo.getParameters();
+            String preprocessPath = bizProcessVo.getPreprocessPath();
+            String resultPath = bizProcessVo.getResultPath();
+            AlgorithmConfig config = algorithmConfigService.getById(algorithmId);
+            String url = config.getAlgorithmAddress();
+            // todo Allen send http
+            AlgorithmBizProcess algorithmBizProcess = MapstructUtils.convert(bizProcessVo, AlgorithmBizProcess.class);
+            algorithmBizProcess.setStartTime(new Date());
+            bizProcessService.updateById(algorithmBizProcess);
+        }
+    }
+
+    private void dateSetProcess(List<AlgorithmDataProcessVo> processVoList) {
+        for (AlgorithmDataProcessVo processVo : processVoList) {
+            Long algorithmId = processVo.getAlgorithmId();
+            String parameters = processVo.getParameters();
+            String preprocessPath = processVo.getPreprocessPath();
+            String resultPath = processVo.getResultPath();
+            AlgorithmConfig config = algorithmConfigService.getById(algorithmId);
+            String url = config.getAlgorithmAddress();
+            // todo Allen send http
+            AlgorithmDataProcess algorithmDataProcess = MapstructUtils.convert(processVo, AlgorithmDataProcess.class);
+            algorithmDataProcess.setStartTime(new Date());
+            dataProcessService.updateById(algorithmDataProcess);
+        }
+    }
 }

+ 523 - 13
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmTaskServiceImpl.java

@@ -1,24 +1,44 @@
 package com.taais.biz.service.impl;
 
-import java.util.Arrays;
-import java.util.List;
-
 import cn.hutool.core.util.ObjectUtil;
+import com.google.gson.Gson;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.AlgorithmTask;
+import com.taais.biz.domain.Data;
+import com.taais.biz.domain.bo.*;
+import com.taais.biz.domain.dto.AlgorithmConfigParamDto;
+import com.taais.biz.domain.dto.task.AlgorithmSubtaskParamDto;
+import com.taais.biz.domain.dto.task.CreateTaskDto;
+import com.taais.biz.domain.dto.task.DataSelectDto;
+import com.taais.biz.domain.dto.task.TaskDto;
+import com.taais.biz.domain.vo.AlgorithmTaskVo;
+import com.taais.biz.domain.vo.DataVo;
+import com.taais.biz.mapper.AlgorithmTaskMapper;
+import com.taais.biz.service.*;
+import com.taais.common.core.core.page.PageResult;
 import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.core.utils.StringUtils;
+import com.taais.common.core.utils.file.FileUtils;
 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.SysDictDataVo;
+import com.taais.system.service.ISysDictDataService;
 import jakarta.annotation.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.taais.biz.mapper.AlgorithmTaskMapper;
-import com.taais.biz.domain.AlgorithmTask;
-import com.taais.biz.domain.bo.AlgorithmTaskBo;
-import com.taais.biz.domain.vo.AlgorithmTaskVo;
-import com.taais.biz.service.IAlgorithmTaskService;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import static com.taais.biz.domain.table.AlgorithmTaskTableDef.ALGORITHM_TASK;
 
 /**
@@ -29,8 +49,25 @@ import static com.taais.biz.domain.table.AlgorithmTaskTableDef.ALGORITHM_TASK;
  */
 @Service
 public class AlgorithmTaskServiceImpl extends BaseServiceImpl<AlgorithmTaskMapper, AlgorithmTask> implements IAlgorithmTaskService {
+
+    private static final Logger log = LoggerFactory.getLogger(AlgorithmTaskServiceImpl.class);
+
+    @Resource
+    ApplicationContext applicationContext;
     @Resource
     private AlgorithmTaskMapper algorithmTaskMapper;
+    @Resource
+    private IAlgorithmConfigService algorithmConfigService;
+    @Resource
+    private IAlgorithmSubtaskService subtaskService;
+    @Resource
+    private IAlgorithmDataProcessService processService;
+    @Resource
+    private IAlgorithmBizProcessService bizProcessService;
+    @Resource
+    private ISysDictDataService dictDataService;
+    @Resource
+    private IDataService dataService;
 
     @Override
     public QueryWrapper query() {
@@ -49,7 +86,6 @@ public class AlgorithmTaskServiceImpl extends BaseServiceImpl<AlgorithmTaskMappe
         (algorithmTaskBo.getEndTime()));
         queryWrapper.and(ALGORITHM_TASK.COST_SECOND.eq
         (algorithmTaskBo.getCostSecond()));
-
         return queryWrapper;
     }
 
@@ -62,7 +98,6 @@ public class AlgorithmTaskServiceImpl extends BaseServiceImpl<AlgorithmTaskMappe
     @Override
     public AlgorithmTaskVo selectById(Long id) {
             return this.getOneAs(query().where(ALGORITHM_TASK.ID.eq(id)), AlgorithmTaskVo.class);
-
     }
 
     /**
@@ -113,8 +148,7 @@ public class AlgorithmTaskServiceImpl extends BaseServiceImpl<AlgorithmTaskMappe
     public boolean update(AlgorithmTaskBo algorithmTaskBo) {
         AlgorithmTask algorithmTask =MapstructUtils.convert(algorithmTaskBo, AlgorithmTask. class);
         if (ObjectUtil.isNotNull(algorithmTask) && ObjectUtil.isNotNull(algorithmTask.getId())){
-            boolean updated = this.updateById(algorithmTask);
-                return updated;
+            return this.updateById(algorithmTask);
         }
         return false;
     }
@@ -131,4 +165,480 @@ public class AlgorithmTaskServiceImpl extends BaseServiceImpl<AlgorithmTaskMappe
         return this.removeByIds(Arrays.asList(ids));
     }
 
+    @Override
+    public String create(CreateTaskDto taskDto) {
+        // 检查,如果检查不通过返回
+        String checkMsg = checkTaskDto(taskDto);
+        if (StringUtils.isNotEmpty(checkMsg)){
+            return checkMsg;
+        }
+        // 创建任务
+        AlgorithmTaskBo algorithmTask = new AlgorithmTaskBo();
+        algorithmTask.setStatus(BizConstant.TASK_STATUS_PENDING);
+        algorithmTask.setName(taskDto.getTaskName());
+        insert(algorithmTask);
+        // 异步处理
+        AlgorithmTaskServiceImpl taskService = applicationContext.getBean(AlgorithmTaskServiceImpl.class);
+        taskService.processTask(taskDto, algorithmTask);
+        return null;
+    }
+
+    @Override
+    public void taskRun() {
+        AlgorithmTask algorithmTask = algorithmTaskMapper.getLastTask();
+        if(algorithmTask!= null){
+            log.info("taskRun start... task id:{}",algorithmTask.getId());
+            subtaskService.subtaskRun(algorithmTask.getId());
+            log.info("taskRun end... task id:{}",algorithmTask.getId());
+        } else {
+            log.info("没有可用的算法任务...");
+        }
+    }
+
+    private String checkTaskDto(CreateTaskDto taskDto) {
+        // todo check taskDto
+        return null;
+    }
+
+    @Async
+    public void processTask(CreateTaskDto taskDto, AlgorithmTaskBo algorithmTask) {
+        // 训练
+        List<String> trainDataFolderPathList = Collections.emptyList();
+        // 2 如果有该,则获取训练数据
+        List<String> selectTask = taskDto.getSelectTask();
+
+        if (selectTask.contains(BizConstant.STEP2_TRAIN_DATA_SELECT)) {
+            trainDataFolderPathList = getTrainDataSet(algorithmTask, taskDto);
+        }
+        // 3 如果有该,训练数据增强
+        if (selectTask.contains(BizConstant.STEP3_TRAIN_DATA_ENHANCEMENT)) {
+            trainDataFolderPathList = createTrainDataEnhancementSubtask(algorithmTask, taskDto, trainDataFolderPathList);
+        }
+        // 4 如果有该,训练数据扩充
+        if (selectTask.contains(BizConstant.STEP4_TRAIN_DATA_EXPANSION)) {
+            trainDataFolderPathList = createTrainDataExpansionSubtask(algorithmTask, taskDto, trainDataFolderPathList);
+        }
+        // 5 如果有该,训练
+        if (selectTask.contains(BizConstant.STEP5_TRAIN)) {
+            createTrainSubtask(algorithmTask, taskDto, trainDataFolderPathList);
+        }
+        // 测试
+        // 6 如果有该,则获取测试数据
+        List<String> testDataFolderPathList = Collections.emptyList();
+        if (selectTask.contains(BizConstant.STEP6_TEST_DATA_SELECT)) {
+            testDataFolderPathList = getTestDataSet(algorithmTask, taskDto);
+        }
+        // 7 如果有该,训练测试增强
+        if (selectTask.contains(BizConstant.STEP7_TEST_DATA_ENHANCEMENT)) {
+            testDataFolderPathList = createTestDataEnhancementSubtask(algorithmTask, taskDto, testDataFolderPathList);
+        }
+        // 8 如果有该,训练测试扩充
+        if (selectTask.contains(BizConstant.STEP8_TEST_DATA_EXPANSION)) {
+            testDataFolderPathList = createTestDataExpansionSubtask(algorithmTask, taskDto, testDataFolderPathList);
+        }
+        // 9 如果有该,测试
+        if (selectTask.contains(BizConstant.STEP9_TEST)) {
+            createTestSubtask(algorithmTask, taskDto, testDataFolderPathList);
+        }
+
+        // 推理
+        List<String> reasoningDataFolderPathList = Collections.emptyList();
+        // 10 如果有该,则获取推理数据
+        if (selectTask.contains(BizConstant.STEP10_REASONING_DATA_SELECT)) {
+            reasoningDataFolderPathList = getReasoningDataSet(algorithmTask, taskDto);
+        }
+        // 11 如果有该,推理数据增强
+        if (selectTask.contains(BizConstant.STEP11_REASONING_DATA_ENHANCEMENT)) {
+            reasoningDataFolderPathList = createReasoningDataEnhancementSubtask(algorithmTask, taskDto, reasoningDataFolderPathList);
+        }
+        // 12 如果有该,推理数据扩充
+        if (selectTask.contains(BizConstant.STEP12_REASONING_DATA_EXPANSION)) {
+            reasoningDataFolderPathList = createReasoningDataExpansionSubtask(algorithmTask, taskDto, reasoningDataFolderPathList);
+        }
+        // 13 如果有该,推理
+        if (selectTask.contains(BizConstant.STEP13_REASONING)) {
+            createReasoningSubtask(algorithmTask, taskDto, reasoningDataFolderPathList);
+        }
+    }
+
+    private void createTestSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> testDataFolderPathList) {
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP9_TEST);
+        subtaskService.insert(algorithmSubtask);
+        Long index = 0L;
+        for (String testDataFolderPath : testDataFolderPathList) {
+            for (TaskDto dto : taskDto.getTrain()) {
+                // 创建算法处理任务
+                AlgorithmBizProcessBo algorithmBizProcessBo = new AlgorithmBizProcessBo();
+                algorithmBizProcessBo.setAlgorithmId(dto.getAlgorithmId());
+                algorithmBizProcessBo.setModelId(dto.getModelId());
+                algorithmBizProcessBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+                algorithmBizProcessBo.setPreprocessPath(testDataFolderPath);
+                algorithmBizProcessBo.setIndex(index);
+                bizProcessService.insert(algorithmBizProcessBo);
+
+                // 组装结果路径 并更新结果路径和参数
+                String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                    + BizConstant.TASK_FOLDER_PATH_MID_TEST + BizConstant.TASK_FOLDER_PATH_TRAIL_RESULT + algorithmBizProcessBo.getId() + "/";
+                String finallyParams = buildFinallyParams(dto.getParams(), testDataFolderPath, resultPath);
+                algorithmBizProcessBo.setResultPath(resultPath);
+                algorithmBizProcessBo.setParameters(finallyParams);
+                bizProcessService.update(algorithmBizProcessBo);
+                index++;
+            }
+        }
+    }
+
+    private List<String> createTestDataExpansionSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> testDataFolderPathList) {
+        List<String> returnList = new ArrayList<>();
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP8_TEST_DATA_EXPANSION);
+        subtaskService.insert(algorithmSubtask);
+        long index = 0;
+        for(String testDataFolderPath : testDataFolderPathList){
+            // 创建数据扩展任务
+            AlgorithmDataProcessBo processBo = new AlgorithmDataProcessBo();
+            processBo.setAlgorithmId(taskDto.getTestDataEnhancement().getAlgorithmId());
+            processBo.setSubTaskId(algorithmSubtask.getId());
+            processBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+            processBo.setPreprocessPath(testDataFolderPath);
+            processBo.setIndex(index);
+            processService.insert(processBo);
+
+            // 组装结果路径 更新参数和结果路径
+            String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_TEST + BizConstant.TASK_FOLDER_PATH_TRAIL_EXPANSION + processBo.getId() + "/";
+            String finallyParams = buildFinallyParams(taskDto.getTestDataExpansion().getParams(), testDataFolderPath, resultPath);
+            processBo.setParameters(finallyParams);
+            processService.update(processBo);
+            returnList.add(resultPath);
+            index++;
+        }
+        return returnList;
+    }
+
+    private List<String> createTestDataEnhancementSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> testDataFolderPathList) {
+        List<String> returnList = new ArrayList<>();
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP7_TEST_DATA_ENHANCEMENT);
+        subtaskService.insert(algorithmSubtask);
+        Long index = 0L;
+        // 创建数据加强任务
+        for (String testDataFolderPath : testDataFolderPathList) {
+            // 创建数据增强任务
+            AlgorithmDataProcessBo processBo = new AlgorithmDataProcessBo();
+            processBo.setAlgorithmId(taskDto.getTestDataEnhancement().getAlgorithmId());
+            processBo.setSubTaskId(algorithmSubtask.getId());
+            processBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+            processBo.setPreprocessPath(testDataFolderPath);
+            processBo.setIndex(index);
+            processService.insert(processBo);
+
+            // 组装结果路径 并更新参数和结果路径
+            String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_TEST + BizConstant.TASK_FOLDER_PATH_TRAIL_ENHANCEMENT + processBo.getId() + "/";
+            // create AlgorithmDataProcess 创建数据处理
+            String finallyParams = buildFinallyParams(taskDto.getTestDataEnhancement().getParams(), testDataFolderPath, resultPath);
+            processBo.setParameters(finallyParams);
+            processBo.setResultPath(resultPath);
+            processService.update(processBo);
+            returnList.add(resultPath);
+            index++;
+        }
+
+
+        return returnList;
+    }
+
+    private List<String> getTestDataSet(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto) {
+        List<String> returnList = new ArrayList<>();
+        // 获取条件
+        List<DataSelectDto> testDataSelectList = taskDto.getTestDataSelect();
+        long index = 0L;
+        for (DataSelectDto testDataSelect : testDataSelectList) {
+            // 获取数据集
+            List<DataVo> testDataList = getDataListByDataSelect(testDataSelect);
+
+            String destinationPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_TEST + BizConstant.TASK_FOLDER_PATH_TRAIL_ORIGINAL + index + "/";
+            // 同步到文件夹
+            copyToDestinationFolder(testDataList, destinationPath.replaceAll("//","/"));
+            returnList.add(destinationPath);
+            index++;
+        }
+        return returnList;
+    }
+
+    private void createReasoningSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> reasoningDataFolderPathList) {
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP13_REASONING);
+        subtaskService.insert(algorithmSubtask);
+        Long index = 0L;
+        for (String reasoningDataFolderPath : reasoningDataFolderPathList) {
+            for (TaskDto dto : taskDto.getTrain()) {
+                // 创建算法处理任务
+                AlgorithmBizProcessBo algorithmBizProcessBo = new AlgorithmBizProcessBo();
+                algorithmBizProcessBo.setAlgorithmId(dto.getAlgorithmId());
+                algorithmBizProcessBo.setModelId(dto.getModelId());
+                algorithmBizProcessBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+                algorithmBizProcessBo.setPreprocessPath(reasoningDataFolderPath);
+                algorithmBizProcessBo.setIndex(index);
+                bizProcessService.insert(algorithmBizProcessBo);
+
+                // 组装结果路径 并更新结果路径和参数
+                String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                    + BizConstant.TASK_FOLDER_PATH_MID_REASONING + BizConstant.TASK_FOLDER_PATH_TRAIL_RESULT + algorithmBizProcessBo.getId() + "/";
+                String finallyParams = buildFinallyParams(dto.getParams(), reasoningDataFolderPath, resultPath);
+                algorithmBizProcessBo.setResultPath(resultPath);
+                algorithmBizProcessBo.setParameters(finallyParams);
+                bizProcessService.update(algorithmBizProcessBo);
+                index++;
+            }
+        }
+    }
+
+    private List<String> createReasoningDataExpansionSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> reasoningDataFolderPathList) {
+        List<String> returnList = new ArrayList<>();
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP12_REASONING_DATA_EXPANSION);
+        subtaskService.insert(algorithmSubtask);
+        long index = 0;
+        for(String reasoningDataFolderPath : reasoningDataFolderPathList){
+            // 创建数据扩展任务
+            AlgorithmDataProcessBo processBo = new AlgorithmDataProcessBo();
+            processBo.setAlgorithmId(taskDto.getReasoningDataEnhancement().getAlgorithmId());
+            processBo.setSubTaskId(algorithmSubtask.getId());
+            processBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+            processBo.setPreprocessPath(reasoningDataFolderPath);
+            processBo.setIndex(index);
+            processService.insert(processBo);
+
+            // 组装结果路径 更新参数和结果路径
+            String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()+"/"
+                + BizConstant.TASK_FOLDER_PATH_MID_REASONING + BizConstant.TASK_FOLDER_PATH_TRAIL_EXPANSION + processBo.getId() + "/";
+            String finallyParams = buildFinallyParams(taskDto.getReasoningDataExpansion().getParams(), reasoningDataFolderPath, resultPath);
+            processBo.setParameters(finallyParams);
+            processService.update(processBo);
+            returnList.add(resultPath);
+            index++;
+        }
+
+
+        return returnList;
+    }
+
+    private List<String> createReasoningDataEnhancementSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> reasoningDataFolderPathList) {
+
+        List<String> returnList = new ArrayList<>();
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP11_REASONING_DATA_ENHANCEMENT);
+        subtaskService.insert(algorithmSubtask);
+        Long index = 0L;
+        // 创建数据加强任务
+        for (String reasoningDataFolderPath : reasoningDataFolderPathList) {
+            // 创建数据增强任务
+            AlgorithmDataProcessBo processBo = new AlgorithmDataProcessBo();
+            processBo.setAlgorithmId(taskDto.getReasoningDataEnhancement().getAlgorithmId());
+            processBo.setSubTaskId(algorithmSubtask.getId());
+            processBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+            processBo.setPreprocessPath(reasoningDataFolderPath);
+            processBo.setIndex(index);
+            processService.insert(processBo);
+
+            // 组装结果路径 并更新参数和结果路径
+            String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId() + "/"
+                + BizConstant.TASK_FOLDER_PATH_MID_REASONING + BizConstant.TASK_FOLDER_PATH_TRAIL_ENHANCEMENT + processBo.getId() + "/";
+            // create AlgorithmDataProcess 创建数据处理
+            String finallyParams = buildFinallyParams(taskDto.getReasoningDataEnhancement().getParams(), reasoningDataFolderPath, resultPath);
+            processBo.setParameters(finallyParams);
+            processBo.setResultPath(resultPath);
+            processService.update(processBo);
+            returnList.add(resultPath);
+            index++;
+        }
+
+
+        return returnList;
+    }
+
+    private List<String> getReasoningDataSet(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto) {
+        List<String> returnList = new ArrayList<>();
+        // 获取条件
+        List<DataSelectDto> reasoningDataSelectList = taskDto.getReasoningDataSelect();
+        long index = 0L;
+        for (DataSelectDto reasoningDataSelect : reasoningDataSelectList) {
+            // 获取数据集
+            List<DataVo> reasoningDataList = getDataListByDataSelect(reasoningDataSelect);
+
+            String destinationPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_REASONING + BizConstant.TASK_FOLDER_PATH_TRAIL_ORIGINAL + index + "/";
+            // 同步到文件夹
+            copyToDestinationFolder(reasoningDataList, destinationPath.replaceAll("//","/"));
+            returnList.add(destinationPath);
+            index++;
+        }
+
+        return returnList;
+    }
+
+    private List<String> createTrainDataEnhancementSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> trainDataFolderPathList) {
+        List<String> returnList = new ArrayList<>();
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP3_TRAIN_DATA_ENHANCEMENT);
+        subtaskService.insert(algorithmSubtask);
+        Long index = 0L;
+        // 创建数据加强任务
+        for (String trainDataFolderPath : trainDataFolderPathList) {
+            // 创建数据增强任务
+            AlgorithmDataProcessBo processBo = new AlgorithmDataProcessBo();
+            processBo.setAlgorithmId(taskDto.getTrainDataEnhancement().getAlgorithmId());
+            processBo.setSubTaskId(algorithmSubtask.getId());
+            processBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+            processBo.setPreprocessPath(trainDataFolderPath);
+            processBo.setIndex(index);
+            processService.insert(processBo);
+
+            // 组装结果路径 并更新参数和结果路径
+            String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_TRAIN + BizConstant.TASK_FOLDER_PATH_TRAIL_ENHANCEMENT + processBo.getId() + "/";
+            // create AlgorithmDataProcess 创建数据处理
+            String finallyParams = buildFinallyParams(taskDto.getTrainDataEnhancement().getParams(), trainDataFolderPath, resultPath);
+            processBo.setParameters(finallyParams);
+            processBo.setResultPath(resultPath);
+            processService.update(processBo);
+            returnList.add(resultPath);
+            index++;
+        }
+
+
+        return returnList;
+    }
+
+    private void createTrainSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> trainDataFolderPathList) {
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP5_TRAIN);
+        subtaskService.insert(algorithmSubtask);
+        Long index = 0L;
+        for (String trainDataFolderPath : trainDataFolderPathList) {
+            for (TaskDto dto : taskDto.getTrain()) {
+                // 创建算法处理任务
+                AlgorithmBizProcessBo algorithmBizProcessBo = new AlgorithmBizProcessBo();
+                algorithmBizProcessBo.setAlgorithmId(dto.getAlgorithmId());
+                algorithmBizProcessBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+                algorithmBizProcessBo.setPreprocessPath(trainDataFolderPath);
+                algorithmBizProcessBo.setIndex(index);
+                bizProcessService.insert(algorithmBizProcessBo);
+
+                // 组装结果路径 并更新结果路径和参数
+                String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                    + BizConstant.TASK_FOLDER_PATH_MID_TRAIN + BizConstant.TASK_FOLDER_PATH_TRAIL_RESULT + algorithmBizProcessBo.getId() + "/";
+                String finallyParams = buildFinallyParams(dto.getParams(), trainDataFolderPath, resultPath);
+                algorithmBizProcessBo.setResultPath(resultPath);
+                algorithmBizProcessBo.setParameters(finallyParams);
+                bizProcessService.update(algorithmBizProcessBo);
+                index++;
+            }
+        }
+    }
+
+    private List<String> createTrainDataExpansionSubtask(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto, List<String> trainDataFolderPathList) {
+        List<String> returnList = new ArrayList<>();
+        // 创建subtask
+        AlgorithmSubtaskBo algorithmSubtask = BuildAlgorithmSubtaskBo(algorithmTask, BizConstant.STEP4_TRAIN_DATA_EXPANSION);
+        subtaskService.insert(algorithmSubtask);
+        long index = 0;
+        for(String trainDataFolderPath : trainDataFolderPathList){
+            // 创建数据扩展任务
+            AlgorithmDataProcessBo processBo = new AlgorithmDataProcessBo();
+            processBo.setAlgorithmId(taskDto.getTrainDataEnhancement().getAlgorithmId());
+            processBo.setSubTaskId(algorithmSubtask.getId());
+            processBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+            processBo.setPreprocessPath(trainDataFolderPath);
+            processBo.setIndex(index);
+            processService.insert(processBo);
+
+            // 组装结果路径 更新参数和结果路径
+            String resultPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_TRAIN + BizConstant.TASK_FOLDER_PATH_TRAIL_EXPANSION + processBo.getId() + "/";
+            String finallyParams = buildFinallyParams(taskDto.getTrainDataExpansion().getParams(), trainDataFolderPath, resultPath);
+            processBo.setParameters(finallyParams);
+            processService.update(processBo);
+            returnList.add(resultPath);
+            index++;
+        }
+
+
+        return returnList;
+    }
+
+    private static AlgorithmSubtaskBo BuildAlgorithmSubtaskBo(AlgorithmTaskBo algorithmTask, String step) {
+        AlgorithmSubtaskBo algorithmSubtask = new AlgorithmSubtaskBo();
+        algorithmSubtask.setTaskId(algorithmTask.getId());
+        algorithmSubtask.setIndex(Long.valueOf(step));
+        algorithmSubtask.setStatus(BizConstant.TASK_STATUS_PENDING);
+        return algorithmSubtask;
+    }
+
+    private static String buildFinallyParams(String params, String trainDataFolderPath, String resultPath) {
+        AlgorithmSubtaskParamDto algorithmSubtaskParamDto = new AlgorithmSubtaskParamDto();
+        algorithmSubtaskParamDto.setSourcePath(trainDataFolderPath);
+        algorithmSubtaskParamDto.setResultPath(resultPath);
+        Gson gson = new Gson();
+        AlgorithmConfigParamDto otherParams = gson.fromJson(params, AlgorithmConfigParamDto.class);
+        algorithmSubtaskParamDto.setOtherParams(otherParams);
+
+        // 将User对象转换为JSON字符串
+        return gson.toJson(algorithmSubtaskParamDto);
+    }
+
+    private List<String> getTrainDataSet(AlgorithmTaskBo algorithmTask, CreateTaskDto taskDto) {
+        List<String> returnList = new ArrayList<>();
+        // 获取条件
+        List<DataSelectDto> trainDataSelectList = taskDto.getTrainDataSelect();
+        long index = 0L;
+        for (DataSelectDto trainDataSelect : trainDataSelectList) {
+            // 获取数据集
+            List<DataVo> trainDataList = getDataListByDataSelect(trainDataSelect);
+
+            String destinationPath = BizConstant.TASK_FOLDER_PATH_HEAD + algorithmTask.getId()
+                + BizConstant.TASK_FOLDER_PATH_MID_TRAIN + BizConstant.TASK_FOLDER_PATH_TRAIL_ORIGINAL + index + "/";
+            // 同步到文件夹
+            copyToDestinationFolder(trainDataList, destinationPath.replaceAll("//","/"));
+            returnList.add(destinationPath);
+            index++;
+        }
+        return returnList;
+    }
+
+    private void copyToDestinationFolder(List<DataVo> trainDataList, String destinationPath) {
+        SysDictDataVo sysDictDataVo = dictDataService.selectDictDataByTypeAndLabel("biz_algorithm_config", "path");
+        String destinationBase = "d:\\taais\\common\\";
+        if (sysDictDataVo!= null && StringUtils.isNotEmpty(sysDictDataVo.getDictValue())) {
+            destinationBase = sysDictDataVo.getDictValue();
+        }
+        int errorCount = 0;
+        for (DataVo dataVo : trainDataList) {
+            try {
+                FileUtils.copyFile(dataVo.getDataSource(),destinationBase + destinationPath);
+            } catch (IOException e) {
+                errorCount++;
+                log.error("复制文件出错source:{},target:{}", dataVo.getDataSource(), destinationBase + destinationPath);
+            }
+        }
+        if(errorCount != 0){
+            log.warn("复制文件失败了{}个!!",errorCount);
+        }
+    }
+
+    private List<DataVo> getDataListByDataSelect(DataSelectDto trainDataSelect) {
+        String condition = trainDataSelect.getCondition();
+        if(trainDataSelect.getConditionSelected() && StringUtils.isNotEmpty(condition)){
+            Gson gson = new Gson();
+            DataBo data = gson.fromJson(condition, DataBo.class);
+            return dataService.selectList(data);
+        } else {
+            List<Data> data = dataService.selectByIds(trainDataSelect.getDateSet());
+            return MapstructUtils.convert(data, DataVo. class);
+        }
+    }
 }

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

@@ -58,6 +58,10 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
         (dataBo.getGatherTime()));
         queryWrapper.and(DATA.GATHER_SPOT.eq
         (dataBo.getGatherSpot()));
+        queryWrapper.and(DATA.URL.eq
+        (dataBo.getUrl()));
+        queryWrapper.and(DATA.LABELURL.eq
+        (dataBo.getLabelurl()));
         queryWrapper.and(DATA.INCREMENT.eq
         (dataBo.getIncrement()));
         queryWrapper.and(DATA.LABELED.eq
@@ -145,4 +149,9 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
         return this.remove(queryWrapper);
     }
 
+    @Override
+    public List<Data> selectByIds(List<Long> ids) {
+        return this.listByIds(ids);
+    }
+
 }

+ 4 - 0
taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmSubtaskMapper.xml

@@ -4,4 +4,8 @@
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.taais.biz.mapper.AlgorithmSubtaskMapper">
 
+<select id="getFirstNeedProcessSubtask" parameterType="Long" resultType="com.taais.biz.domain.AlgorithmSubtask">
+    select * from algorithm_subtask t where t.task_id = #{id} and t.status = '1' order by t.index asc limit 1
+</select>
+
 </mapper>

+ 3 - 1
taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmTaskMapper.xml

@@ -3,5 +3,7 @@
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.taais.biz.mapper.AlgorithmTaskMapper">
-
+<select id="AlgorithmTaskMapper" resultType="com.taais.biz.domain.AlgorithmTask">
+    select * from algorithm_task t where t.status = "1" and order by t.id asc limit 1
+</select>
 </mapper>

+ 2 - 0
taais-modules/taais-system/src/main/java/com/taais/system/service/ISysDictDataService.java

@@ -96,4 +96,6 @@ public interface ISysDictDataService extends IBaseService<SysDictData> {
      * @return 结果
      */
     boolean updateDictDataType(String oldDictType, String newDictType);
+
+    SysDictDataVo selectDictDataByTypeAndLabel(String dictType, String label);
 }

+ 17 - 0
taais-modules/taais-system/src/main/java/com/taais/system/service/impl/SysDictDataServiceImpl.java

@@ -17,6 +17,7 @@ import com.mybatisflex.core.query.QueryWrapper;
 import com.mybatisflex.core.update.UpdateChain;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
@@ -191,4 +192,20 @@ public class SysDictDataServiceImpl extends BaseServiceImpl<SysDictDataMapper, S
             .where(SysDictData::getDictType).eq(oldDictType)
             .update();
     }
+
+    @Override
+    public SysDictDataVo selectDictDataByTypeAndLabel(String dictType, String label) {
+        SysDictDataVo returnValue = null;
+        if (StringUtils.isEmpty(label)) {
+            return returnValue;
+        }
+        List<SysDictDataVo> sysDictDataVos = selectDictDataByType(dictType);
+        for (SysDictDataVo vo : sysDictDataVos) {
+            if (label.equals(vo.getDictLabel())) {
+                returnValue = vo;
+                break;
+            }
+        }
+        return returnValue;
+    }
 }