Переглянути джерело

Merge branch 'dev_lsk_taskconfig' of www/taais into develop

Sk18834839360 10 місяців тому
батько
коміт
8bf1b5747b
57 змінених файлів з 3886 додано та 66 видалено
  1. 357 0
      script/sql/postgresql/data(postgresql).sql
  2. BIN
      script/sql/postgresql/taais20240815-2.sql
  3. BIN
      script/sql/postgresql/taais2024811.sql
  4. 3 21
      taais-admin/src/main/resources/application-dev.yml
  5. 13 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/component/ScheduledTasks.java
  6. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmTaskConfigurationController.java
  7. 23 6
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java
  8. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskController.java
  9. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskDetailsController.java
  10. 133 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java
  11. 60 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmTaskConfiguration.java
  12. 46 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtask.java
  13. 80 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java
  14. 43 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationTask.java
  15. 75 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/AlgorithmTaskConfigurationBo.java
  16. 16 16
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/DataBo.java
  17. 48 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskBo.java
  18. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskDetailsBo.java
  19. 44 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationTaskBo.java
  20. 40 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTargetIdentificationTaskDto.java
  21. 64 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationImportVo.java
  22. 74 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationVo.java
  23. 30 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/BatchDataResult.java
  24. 9 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataSelectVo.java
  25. 85 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsImportVo.java
  26. 95 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsVo.java
  27. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskImportVo.java
  28. 53 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskVo.java
  29. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskImportVo.java
  30. 50 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskVo.java
  31. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/AlgorithmTaskConfigurationImportListener.java
  32. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskDetailsImportListener.java
  33. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskImportListener.java
  34. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationTaskImportListener.java
  35. 3 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmModelMapper.java
  36. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmTaskConfigurationMapper.java
  37. 7 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/DataMapper.java
  38. 21 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.java
  39. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskMapper.java
  40. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationTaskMapper.java
  41. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmTaskConfigurationService.java
  42. 19 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java
  43. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskDetailsService.java
  44. 71 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskService.java
  45. 70 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationTaskService.java
  46. 1 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmModelServiceImpl.java
  47. 138 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmTaskConfigurationServiceImpl.java
  48. 73 21
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
  49. 159 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java
  50. 263 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java
  51. 375 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java
  52. 3 0
      taais-modules/taais-biz/src/main/resources/mapper/ag/AlgorithmModelMapper.xml
  53. 12 0
      taais-modules/taais-biz/src/main/resources/mapper/biz/DataMapper.xml
  54. 11 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskDetailsMapper.xml
  55. 18 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskMapper.xml
  56. 18 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationTaskMapper.xml
  57. 7 0
      taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmTaskConfigurationMapper.xml

+ 357 - 0
script/sql/postgresql/data(postgresql).sql

@@ -747,3 +747,360 @@ values(2024061115344104, '算法数据集合删除', 2024061115344100, '4',  '',
 
 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, '');
+
+-- 20240817更新
+-- @author sukang
+-- 训练测试任务配置表
+DROP TABLE IF EXISTS public.algorithm_task_configuration;
+CREATE TABLE "public"."algorithm_task_configuration" (
+ id BIGINT PRIMARY KEY,
+ name VARCHAR(255) NOT NULL,
+ train_url VARCHAR(255),
+ train_params TEXT,
+ verify_url VARCHAR(255),
+ verify_params TEXT,
+ test_url VARCHAR(255),
+ test_params TEXT,
+ remark VARCHAR(400),
+ "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,
+ "tenant_id" "pg_catalog"."int8" DEFAULT 0,
+ version           integer                 DEFAULT 0,
+ del_flag      smallint               DEFAULT '0'::smallint         NOT NULL,
+ CONSTRAINT "algorithm_task_configuration_pkey" PRIMARY KEY ("id")
+);
+ALTER TABLE "public"."algorithm_task_configuration"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."algorithm_task_configuration" IS '训练测试任务配置表';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."id" IS '主键ID';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."name" IS '算法任务名称';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."train_url" IS '训练算法地址';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."train_params" IS '训练超参配置';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."verify_url" IS '验证算法地址';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."verify_params" IS '验证超参配置';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."test_url" IS '测试算法地址';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."test_params" IS '测试超参配置';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."remark" IS '备注';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."create_by" IS '创建人';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."create_time" IS '创建时间';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."update_by" IS '更新人';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."update_time" IS '更新时间';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."tenant_id" IS '租户编码';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."version" IS '乐观锁';
+COMMENT ON COLUMN "public"."algorithm_task_configuration"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+-- 菜单 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(2024082310223600, '算法任务配置', 152584418900430848, '1', '/config/taskConfiguration', 'task/taskConfiguration/index', 1, 0, 'C', '0', '0', 'task:taskConfiguration: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(2024082310223601, '算法任务查询', 2024082310223600, '1',  '', '', 1, 0, 'F', '0', '0', 'task:taskConfiguration: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(2024082310223602, '算法任务新增', 2024082310223600, '2',  '', '', 1, 0, 'F', '0', '0', 'task:taskConfiguration: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(2024082310223603, '算法任务修改', 2024082310223600, '3',  '', '', 1, 0, 'F', '0', '0', 'task:taskConfiguration: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(2024082310223604, '算法任务删除', 2024082310223600, '4',  '', '', 1, 0, 'F', '0', '0', 'task:taskConfiguration: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(2024082310223605, '算法任务导出', 2024082310223600, '5',  '', '', 1, 0, 'F', '0', '0', 'task:taskConfiguration:export',       '', 1, now(), 1, null, '');
+
+DROP TABLE IF EXISTS public.target_identification_task;
+
+CREATE TABLE "public"."target_identification_task" (
+ "id" "pg_catalog"."int8" NOT NULL,
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" 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 "target_identification_task_pk" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."target_identification_task"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."target_identification_task"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."target_identification_task"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."target_identification_task"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."target_identification_task"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."target_identification_task"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."target_identification_task"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."target_identification_task"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."target_identification_task"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."target_identification_task"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."target_identification_task"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."target_identification_task"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON TABLE "public"."target_identification_task" IS '目标识别任务';
+
+DROP TABLE IF EXISTS public.target_identification_subtask;
+
+CREATE TABLE "public"."target_identification_subtask" (
+ "id" "pg_catalog"."int8" NOT NULL,
+ "task_id" "pg_catalog"."int8",
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" 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,
+ CONSTRAINT "target_identification_subtask_pk" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."target_identification_subtask"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."task_id" IS '任务ID';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."target_identification_subtask"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON TABLE "public"."target_identification_subtask" IS '目标识别子任务';
+
+DROP TABLE IF EXISTS public.target_identification_subtask_details;
+
+CREATE TABLE "public"."target_identification_subtask_details" (
+ "id" "pg_catalog"."int8" NOT NULL,
+ "subtask_id" "pg_catalog"."int8",
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "algorithm_id" "pg_catalog"."int8",
+ "data_batch_nums" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "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,
+ CONSTRAINT "target_identification_subtask_details_pk" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."target_identification_subtask_details"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."subtask_id" IS '子任务id';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."type" IS '任务类型(1训练,2验证,3测试)';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."algorithm_id" IS '算法';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."data_batch_nums" IS '数据批次号';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."parameters" IS '调用算法时所用的参数';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."preprocess_path" IS '预处理数据路径';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."result_path" IS '结果数据路径';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."index" IS '序号';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."start_time" IS '开始时间';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."end_time" IS '结束时间';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."cost_second" IS '耗时';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."target_identification_subtask_details"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON TABLE "public"."target_identification_subtask_details" IS '目标识别子任务详情';
+
+DROP TABLE IF EXISTS public.data_amplification_task;
+
+CREATE TABLE "public"."data_amplification_task" (
+ "id" "pg_catalog"."int8" NOT NULL,
+ "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "data_batch_nums" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+ "parameters" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+ "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,
+ CONSTRAINT "data_amplification_task_pkey" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."data_amplification_task"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."data_amplification_task"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."data_batch_nums" IS '数据批次号';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."parameters" IS '调用算法时所用的参数';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."start_time" IS '开始时间';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."end_time" IS '结束时间';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."cost_second" IS '耗时';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."log" IS '日志';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."data_amplification_task"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON TABLE "public"."data_amplification_task" 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(2024081714395300, '目标识别任务', 153308760386924544, '1', 'identificationTask', 'identification/identificationTask/index', 1, 0, 'C', '0', '0', 'identification:identificationTask: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(2024081714395301, '目标识别任务查询', 2024081714395300, '1',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationTask: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(2024081714395302, '目标识别任务新增', 2024081714395300, '2',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationTask: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(2024081714395303, '目标识别任务修改', 2024081714395300, '3',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationTask: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(2024081714395304, '目标识别任务删除', 2024081714395300, '4',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationTask: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(2024081714395305, '目标识别任务导出', 2024081714395300, '5',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationTask: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(2024081714564100, '目标识别子任务详情', 153308760386924544, '1', 'identificationSubtaskDetails', 'identification/identificationSubtaskDetails/index', 1, 0, 'C', '0', '0', 'identification:identificationSubtaskDetails: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(2024081714564101, '目标识别子任务详情查询', 2024081714564100, '1',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtaskDetails: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(2024081714564102, '目标识别子任务详情新增', 2024081714564100, '2',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtaskDetails: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(2024081714564103, '目标识别子任务详情修改', 2024081714564100, '3',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtaskDetails: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(2024081714564104, '目标识别子任务详情删除', 2024081714564100, '4',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtaskDetails: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(2024081714564105, '目标识别子任务详情导出', 2024081714564100, '5',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtaskDetails: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(2024081714395200, '目标识别子任务', 153308760386924544, '1', 'identificationSubtask', 'identification/identificationSubtask/index', 1, 0, 'C', '0', '0', 'identification:identificationSubtask: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(2024081714395201, '目标识别子任务查询', 2024081714395200, '1',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtask: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(2024081714395202, '目标识别子任务新增', 2024081714395200, '2',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtask: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(2024081714395203, '目标识别子任务修改', 2024081714395200, '3',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtask: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(2024081714395204, '目标识别子任务删除', 2024081714395200, '4',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtask: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(2024081714395205, '目标识别子任务导出', 2024081714395200, '5',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtask:export',       '', 1, now(), 1, null, '');

BIN
script/sql/postgresql/taais20240815-2.sql


BIN
script/sql/postgresql/taais2024811.sql


+ 3 - 21
taais-admin/src/main/resources/application-dev.yml

@@ -26,45 +26,27 @@ mybatis-flex:
     # 数据源-1
     ds1:
       # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
-      # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
       type: ${spring.datasource.type}
-      # mysql数据库
-      #      driver-class-name: com.mysql.cj.jdbc.Driver
-      #      url: jdbc:mysql://localhost:3306/km?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
-      #      username: root
-      #      password: Root@369
       #postgresql数据库
       driver-class-name: org.postgresql.Driver
+#      url: jdbc:postgresql://localhost:5432/taais?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
       url: jdbc:postgresql://110.41.34.83:5432/taais?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
       username: postgres
       password: P3x0LG8jzyHRX59l
 
-#    # 数据源-2
-#    ds2:
-#      # 指定为HikariDataSource
-#      type: ${spring.datasource.type}
-#      # mysql数据库
-#      driver-class-name: com.mysql.cj.jdbc.Driver
-#      url: jdbc:mysql://localhost:3306/km?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
-#      username: root
-#      password: Root@369
-#      #postgresql数据库
-##      driver-class-name: org.postgresql.Driver
-##      url: jdbc:postgresql://localhost:5432/km?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
-##      username: postgres
-##      password: postgres@369
-
 # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
 spring.data:
   redis:
     # 地址
     host: 110.41.34.83
+#    host: localhost
     # 端口,默认为6379
     port: 6379
     # 数据库索引
     database: 0
     # 密码(如没有密码请注释掉)
     password: Z;G4AS:Vor'YF#p?
+#    password: CWwYsGjafmv8Sr7g
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl

+ 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");
+    }
 }

+ 109 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmTaskConfigurationController.java

@@ -0,0 +1,109 @@
+package com.taais.biz.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.taais.common.core.core.domain.CommonResult;
+import com.taais.common.excel.utils.ExcelUtil;
+import com.taais.common.log.annotation.Log;
+import com.taais.common.log.enums.BusinessType;
+import com.taais.common.web.annotation.RepeatSubmit;
+import com.taais.common.web.core.BaseController;
+import jakarta.annotation.Resource;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.biz.domain.bo.AlgorithmTaskConfigurationBo;
+import com.taais.biz.service.IAlgorithmTaskConfigurationService;
+
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 算法任务Controller
+ *
+ * @author 0
+ * 2024-08-23
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/task/taskConfiguration")
+public class AlgorithmTaskConfigurationController extends BaseController {
+    @Resource
+    private IAlgorithmTaskConfigurationService algorithmTaskConfigurationService;
+
+    /**
+     * 查询算法任务列表
+     */
+    @SaCheckPermission("task:taskConfiguration:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<AlgorithmTaskConfigurationVo>> list(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        return CommonResult.success(algorithmTaskConfigurationService.selectPage(algorithmTaskConfigurationBo));
+    }
+
+    /**
+     * 导出算法任务列表
+     */
+    @SaCheckPermission("task:taskConfiguration:export")
+    @Log(title = "算法任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        List<AlgorithmTaskConfigurationVo> list = algorithmTaskConfigurationService.selectList(algorithmTaskConfigurationBo);
+        ExcelUtil.exportExcel(list, "算法任务", AlgorithmTaskConfigurationVo.class, response);
+    }
+
+    /**
+     * 获取算法任务详细信息
+     */
+    @SaCheckPermission("task:taskConfiguration:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<AlgorithmTaskConfigurationVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(algorithmTaskConfigurationService.selectById(id));
+    }
+
+    /**
+     * 新增算法任务
+     */
+    @SaCheckPermission("task:taskConfiguration:add")
+    @Log(title = "算法任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        boolean inserted = algorithmTaskConfigurationService.insert(algorithmTaskConfigurationBo);
+        if (!inserted) {
+            return CommonResult.fail("新增算法任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改算法任务
+     */
+    @SaCheckPermission("task:taskConfiguration:edit")
+    @Log(title = "算法任务", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        Boolean updated = algorithmTaskConfigurationService.update(algorithmTaskConfigurationBo);
+        if (!updated) {
+            return CommonResult.fail("修改算法任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除算法任务
+     */
+    @SaCheckPermission("task:taskConfiguration:remove")
+    @Log(title = "算法任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = algorithmTaskConfigurationService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除算法任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 23 - 6
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java

@@ -1,6 +1,12 @@
 package com.taais.biz.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.taais.biz.domain.vo.BatchDataResult;
+import com.taais.biz.domain.Data;
+import com.taais.biz.domain.bo.DataBo;
+import com.taais.biz.domain.vo.DataSelectVo;
+import com.taais.biz.domain.vo.DataVo;
+import com.taais.biz.service.IDataService;
 import com.taais.common.core.core.domain.CommonResult;
 import com.taais.common.core.core.page.PageResult;
 import com.taais.common.excel.utils.ExcelUtil;
@@ -8,10 +14,6 @@ import com.taais.common.log.annotation.Log;
 import com.taais.common.log.enums.BusinessType;
 import com.taais.common.web.annotation.RepeatSubmit;
 import com.taais.common.web.core.BaseController;
-import com.taais.biz.domain.Data;
-import com.taais.biz.domain.bo.DataBo;
-import com.taais.biz.domain.vo.DataVo;
-import com.taais.biz.service.IDataService;
 import com.taais.system.config.ServerConfig;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
@@ -49,9 +51,24 @@ public class DataController extends BaseController {
     @SaCheckPermission("demo:data:list")
     @GetMapping("/list")
     public CommonResult<PageResult<DataVo>> list(DataBo dataBo) {
-
         return CommonResult.success(dataService.selectPage(dataBo));
+    }
+
+    /**
+     * 获取 查询数据管理列表 搜索条目下拉列表
+     *
+     * @param field 查询的字段名称
+     * @return {@link CommonResult }<{@link List }<{@link String }>>查询的字段名称 的所有种类
+     */
+    @SaCheckPermission("demo:data:list")
+    @GetMapping("/getFromSelects")
+    public CommonResult<List<DataSelectVo>> getFromSelects(String field) {
+        return CommonResult.success(dataService.getFormSelects(field));
+    }
 
+    @GetMapping("/batchList")
+    public CommonResult<List<BatchDataResult>> list() {
+        return CommonResult.success(dataService.batchSelect());
     }
 
     /**
@@ -129,6 +146,6 @@ public class DataController extends BaseController {
         if (file == null) {
             return CommonResult.fail("请上传.zip、.rar压缩文件。");
         }
-        return dataService.uploadDataInfo(file,dataInfo);
+        return dataService.uploadDataInfo(file, dataInfo);
     }
 }

+ 109 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskController.java

@@ -0,0 +1,109 @@
+package com.taais.biz.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.taais.common.core.core.domain.CommonResult;
+import com.taais.common.excel.utils.ExcelUtil;
+import com.taais.common.log.annotation.Log;
+import com.taais.common.log.enums.BusinessType;
+import com.taais.common.web.annotation.RepeatSubmit;
+import com.taais.common.web.core.BaseController;
+import jakarta.annotation.Resource;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskVo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+import com.taais.biz.service.ITargetIdentificationSubtaskService;
+
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 目标识别子任务Controller
+ *
+ * @author Allen
+ * 2024-08-17
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/identification/identificationSubtask")
+public class TargetIdentificationSubtaskController extends BaseController {
+    @Resource
+    private ITargetIdentificationSubtaskService targetIdentificationSubtaskService;
+
+    /**
+     * 查询目标识别子任务列表
+     */
+    @SaCheckPermission("identification:identificationSubtask:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<TargetIdentificationSubtaskVo>> list(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        return CommonResult.success(targetIdentificationSubtaskService.selectPage(targetIdentificationSubtaskBo));
+    }
+
+    /**
+     * 导出目标识别子任务列表
+     */
+    @SaCheckPermission("identification:identificationSubtask:export")
+    @Log(title = "目标识别子任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        List<TargetIdentificationSubtaskVo> list = targetIdentificationSubtaskService.selectList(targetIdentificationSubtaskBo);
+        ExcelUtil.exportExcel(list, "目标识别子任务", TargetIdentificationSubtaskVo.class, response);
+    }
+
+    /**
+     * 获取目标识别子任务详细信息
+     */
+    @SaCheckPermission("identification:identificationSubtask:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<TargetIdentificationSubtaskVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(targetIdentificationSubtaskService.selectById(id));
+    }
+
+    /**
+     * 新增目标识别子任务
+     */
+    @SaCheckPermission("identification:identificationSubtask:add")
+    @Log(title = "目标识别子任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        boolean inserted = targetIdentificationSubtaskService.insert(targetIdentificationSubtaskBo);
+        if (!inserted) {
+            return CommonResult.fail("新增目标识别子任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改目标识别子任务
+     */
+    @SaCheckPermission("identification:identificationSubtask:edit")
+    @Log(title = "目标识别子任务", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        Boolean updated = targetIdentificationSubtaskService.update(targetIdentificationSubtaskBo);
+        if (!updated) {
+            return CommonResult.fail("修改目标识别子任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除目标识别子任务
+     */
+    @SaCheckPermission("identification:identificationSubtask:remove")
+    @Log(title = "目标识别子任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = targetIdentificationSubtaskService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除目标识别子任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 109 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskDetailsController.java

@@ -0,0 +1,109 @@
+package com.taais.biz.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.taais.common.core.core.domain.CommonResult;
+import com.taais.common.excel.utils.ExcelUtil;
+import com.taais.common.log.annotation.Log;
+import com.taais.common.log.enums.BusinessType;
+import com.taais.common.web.annotation.RepeatSubmit;
+import com.taais.common.web.core.BaseController;
+import jakarta.annotation.Resource;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
+
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 目标识别子任务Controller
+ *
+ * @author 0
+ * 2024-08-17
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/identification/identificationSubtaskDetails")
+public class TargetIdentificationSubtaskDetailsController extends BaseController {
+    @Resource
+    private ITargetIdentificationSubtaskDetailsService targetIdentificationSubtaskDetailsService;
+
+    /**
+     * 查询目标识别子任务列表
+     */
+    @SaCheckPermission("identification:identificationSubtaskDetails:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<TargetIdentificationSubtaskDetailsVo>> list(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        return CommonResult.success(targetIdentificationSubtaskDetailsService.selectPage(targetIdentificationSubtaskDetailsBo));
+    }
+
+    /**
+     * 导出目标识别子任务列表
+     */
+    @SaCheckPermission("identification:identificationSubtaskDetails:export")
+    @Log(title = "目标识别子任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        List<TargetIdentificationSubtaskDetailsVo> list = targetIdentificationSubtaskDetailsService.selectList(targetIdentificationSubtaskDetailsBo);
+        ExcelUtil.exportExcel(list, "目标识别子任务", TargetIdentificationSubtaskDetailsVo.class, response);
+    }
+
+    /**
+     * 获取目标识别子任务详细信息
+     */
+    @SaCheckPermission("identification:identificationSubtaskDetails:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<TargetIdentificationSubtaskDetailsVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(targetIdentificationSubtaskDetailsService.selectById(id));
+    }
+
+    /**
+     * 新增目标识别子任务
+     */
+    @SaCheckPermission("identification:identificationSubtaskDetails:add")
+    @Log(title = "目标识别子任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        boolean inserted = targetIdentificationSubtaskDetailsService.insert(targetIdentificationSubtaskDetailsBo);
+        if (!inserted) {
+            return CommonResult.fail("新增目标识别子任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改目标识别子任务
+     */
+    @SaCheckPermission("identification:identificationSubtaskDetails:edit")
+    @Log(title = "目标识别子任务", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        Boolean updated = targetIdentificationSubtaskDetailsService.update(targetIdentificationSubtaskDetailsBo);
+        if (!updated) {
+            return CommonResult.fail("修改目标识别子任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除目标识别子任务
+     */
+    @SaCheckPermission("identification:identificationSubtaskDetails:remove")
+    @Log(title = "目标识别子任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = targetIdentificationSubtaskDetailsService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除目标识别子任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 133 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java

@@ -0,0 +1,133 @@
+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;
+import com.taais.common.excel.utils.ExcelUtil;
+import com.taais.common.log.annotation.Log;
+import com.taais.common.log.enums.BusinessType;
+import com.taais.common.web.annotation.RepeatSubmit;
+import com.taais.common.web.core.BaseController;
+import jakarta.annotation.Resource;
+import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
+import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
+import com.taais.biz.service.ITargetIdentificationTaskService;
+
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 目标识别任务Controller
+ *
+ * @author km
+ * 2024-08-17
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/identification/identificationTask")
+public class TargetIdentificationTaskController extends BaseController {
+    @Resource
+    private ITargetIdentificationTaskService targetIdentificationTaskService;
+
+    /**
+     * 查询目标识别任务列表
+     */
+    @SaCheckPermission("identification:identificationTask:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<TargetIdentificationTaskVo>> list(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        return CommonResult.success(targetIdentificationTaskService.selectPage(targetIdentificationTaskBo));
+    }
+
+    /**
+     * 导出目标识别任务列表
+     */
+    @SaCheckPermission("identification:identificationTask:export")
+    @Log(title = "目标识别任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        List<TargetIdentificationTaskVo> list = targetIdentificationTaskService.selectList(targetIdentificationTaskBo);
+        ExcelUtil.exportExcel(list, "目标识别任务", TargetIdentificationTaskVo.class, response);
+    }
+
+    /**
+     * 获取目标识别任务详细信息
+     */
+    @SaCheckPermission("identification:identificationTask:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<TargetIdentificationTaskVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(targetIdentificationTaskService.selectById(id));
+    }
+
+    /**
+     * 新增目标识别任务
+     */
+    @SaCheckPermission("identification:identificationTask:add")
+    @Log(title = "目标识别任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        boolean inserted = targetIdentificationTaskService.insert(targetIdentificationTaskBo);
+        if (!inserted) {
+            return CommonResult.fail("新增目标识别任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改目标识别任务
+     */
+    @SaCheckPermission("identification:identificationTask:edit")
+    @Log(title = "目标识别任务", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        Boolean updated = targetIdentificationTaskService.update(targetIdentificationTaskBo);
+        if (!updated) {
+            return CommonResult.fail("修改目标识别任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除目标识别任务
+     */
+    @SaCheckPermission("identification:identificationTask:remove")
+    @Log(title = "目标识别任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = targetIdentificationTaskService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除目标识别任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    @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();
+    }
+}

+ 60 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmTaskConfiguration.java

@@ -0,0 +1,60 @@
+package com.taais.biz.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.KeyType;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 算法任务对象 algorithm_task_configuration
+ *
+ * @author 0
+ * 2024-08-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "algorithm_task_configuration")
+public class AlgorithmTaskConfiguration extends BaseEntity
+    {
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @Id(keyType = KeyType.None)
+    private Long id;
+
+    /** 算法任务名称 */
+    private String name;
+
+    /** 训练算法地址 */
+    private String trainUrl;
+
+    /** 训练超参配置 */
+    private String trainParams;
+
+    /** 验证算法地址 */
+    private String verifyUrl;
+
+    /** 验证超参配置 */
+    private String verifyParams;
+
+    /** 测试算法地址 */
+    private String testUrl;
+
+    /** 测试超参配置 */
+    private String testParams;
+
+    /** 备注 */
+    private String remark;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 46 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtask.java

@@ -0,0 +1,46 @@
+package com.taais.biz.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别子任务对象 target_identification_subtask
+ *
+ * @author Allen
+ * 2024-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "target_identification_subtask")
+public class TargetIdentificationSubtask extends BaseEntity
+    {
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @Id
+    private Long id;
+
+    // 任务id
+    private Long taskId;
+
+    /** 任务名称 */
+    private String name;
+
+    /** 任务状态 */
+    private String status;
+
+    /** 备注 */
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+}

+ 80 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java

@@ -0,0 +1,80 @@
+package com.taais.biz.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别子任务对象 target_identification_subtask_details
+ *
+ * @author 0
+ * 2024-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "target_identification_subtask_details")
+public class TargetIdentificationSubtaskDetails extends BaseEntity
+    {
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @Id
+    private Long id;
+
+    // 子任务id
+    private Long subtaskId;
+
+    /** 任务名称 */
+    private String name;
+
+    /** 任务状态 */
+    private String status;
+
+    /** 算法 */
+    private Long algorithmId;
+
+    private String type;
+
+    /** 数据批次号 */
+    private String dataBatchNums;
+
+    /** 调用算法时所用的参数 */
+    private String parameters;
+
+    /** 预处理数据路径 */
+    private String preprocessPath;
+
+    /** 结果数据路径 */
+    private String resultPath;
+
+    /** 序号 */
+    private Long index;
+
+    /** 开始时间 */
+    private Date startTime;
+
+    /** 结束时间 */
+    private Date endTime;
+
+    /** 耗时 */
+    private Long costSecond;
+
+    /** $column.columnComment */
+    private String log;
+
+    /** 备注 */
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+}

+ 43 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationTask.java

@@ -0,0 +1,43 @@
+package com.taais.biz.domain;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别任务对象 target_identification_task
+ *
+ * @author km
+ * 2024-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "target_identification_task")
+public class TargetIdentificationTask extends BaseEntity
+    {
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @Id
+    private Long id;
+
+    /** 任务名称 */
+    private String name;
+
+    /** 任务状态 */
+    private String status;
+
+    /** 备注 */
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+}

+ 75 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/AlgorithmTaskConfigurationBo.java

@@ -0,0 +1,75 @@
+package com.taais.biz.domain.bo;
+
+import com.taais.biz.domain.AlgorithmTaskConfiguration;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 算法任务业务对象 algorithm_task_configuration
+ *
+ * @author 0
+ * @date 2024-08-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AlgorithmTaskConfiguration.class, reverseConvertGenerate = false)
+public class AlgorithmTaskConfigurationBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    //@NotNull(message = "主键ID不能为空")
+    private Long id;
+
+    /**
+     * 算法任务名称
+     */
+    @NotBlank(message = "算法任务名称不能为空")
+    private String name;
+
+    /**
+     * 训练算法地址
+     */
+    @NotBlank(message = "训练算法地址不能为空")
+    private String trainUrl;
+
+    /**
+     * 训练超参配置
+     */
+    @NotBlank(message = "训练超参配置不能为空")
+    private String trainParams;
+
+    /**
+     * 验证算法地址
+     */
+    @NotBlank(message = "验证算法地址不能为空")
+    private String verifyUrl;
+
+    /**
+     * 验证超参配置
+     */
+    @NotBlank(message = "验证超参配置不能为空")
+    private String verifyParams;
+
+    /**
+     * 测试算法地址
+     */
+    @NotBlank(message = "测试算法地址不能为空")
+    private String testUrl;
+
+    /**
+     * 测试超参配置
+     */
+    @NotBlank(message = "测试超参配置不能为空")
+    private String testParams;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空")
+    private String remark;
+
+
+}

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

@@ -30,17 +30,17 @@ public class DataBo {
     @NotBlank(message = "名称不能为空")
     private String name;
 
-    /**
-     * 数据类型
-     */
-    @NotBlank(message = "数据类型不能为空")
-    private String dataType;
-
-    /**
-     * 文件类型
-     */
-    @NotBlank(message = "文件类型不能为空")
-    private String fileType;
+//    /**
+//     * 数据类型
+//     */
+//    @NotBlank(message = "数据类型不能为空")
+//    private String dataType;
+
+//    /**
+//     * 文件类型
+//     */
+//    @NotBlank(message = "文件类型不能为空")
+//    private String fileType;
 
     /**
      * 目标类型
@@ -94,11 +94,11 @@ public class DataBo {
      */
     private String labelurl;
 
-    /**
-     * 扩增方式
-     */
-    @NotBlank(message = "扩增方式不能为空")
-    private String increment;
+//    /**
+//     * 扩增方式
+//     */
+//    @NotBlank(message = "扩增方式不能为空")
+//    private String increment;
 
     /**
      * 是否标注

+ 48 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskBo.java

@@ -0,0 +1,48 @@
+package com.taais.biz.domain.bo;
+
+import com.taais.biz.domain.TargetIdentificationSubtask;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别子任务业务对象 target_identification_subtask
+ *
+ * @author Allen
+ * @date 2024-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TargetIdentificationSubtask.class, reverseConvertGenerate = false)
+public class TargetIdentificationSubtaskBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空")
+    private Long id;
+
+    // 任务id
+    private Long taskId;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank(message = "任务名称不能为空")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    @NotBlank(message = "任务状态不能为空")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空")
+    private String remarks;
+
+
+}

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

@@ -0,0 +1,109 @@
+package com.taais.biz.domain.bo;
+
+import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别子任务业务对象 target_identification_subtask_details
+ *
+ * @author 0
+ * @date 2024-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TargetIdentificationSubtaskDetails.class, reverseConvertGenerate = false)
+public class TargetIdentificationSubtaskDetailsBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空")
+    private Long id;
+
+    // 子任务id
+    private Long subtaskId;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank(message = "任务名称不能为空")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    @NotBlank(message = "任务状态不能为空")
+    private String status;
+
+    /**
+     * 算法
+     */
+    @NotNull(message = "算法不能为空")
+    private Long algorithmId;
+
+    @NotNull(message = "算法URL不能为空")
+    private String type;
+
+    /**
+     * 数据批次号
+     */
+    @NotBlank(message = "数据批次号不能为空")
+    private String dataBatchNums;
+
+    /**
+     * 调用算法时所用的参数
+     */
+    @NotBlank(message = "调用算法时所用的参数不能为空")
+    private String parameters;
+
+    /**
+     * 预处理数据路径
+     */
+    @NotBlank(message = "预处理数据路径不能为空")
+    private String preprocessPath;
+
+    /**
+     * 结果数据路径
+     */
+    @NotBlank(message = "结果数据路径不能为空")
+    private String resultPath;
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空")
+    private Long index;
+
+    /**
+     * 开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+    /**
+     * 耗时
+     */
+    private Long costSecond;
+
+    /**
+     * $column.columnComment
+     */
+    private String log;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+}

+ 44 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationTaskBo.java

@@ -0,0 +1,44 @@
+package com.taais.biz.domain.bo;
+
+import com.taais.biz.domain.TargetIdentificationTask;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别任务业务对象 target_identification_task
+ *
+ * @author km
+ * @date 2024-08-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TargetIdentificationTask.class, reverseConvertGenerate = false)
+public class TargetIdentificationTaskBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空")
+    private Long id;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank(message = "任务名称不能为空")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    @NotBlank(message = "任务状态不能为空")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空")
+    private String remarks;
+
+}

+ 40 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTargetIdentificationTaskDto.java

@@ -0,0 +1,40 @@
+package com.taais.biz.domain.dto.task;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author allen
+ */
+@Data
+public class CreateTargetIdentificationTaskDto {
+
+    public static final String TASK_TYPE_MORE_DATA_AND_SINGLE_ALGORITHM = "1";
+    public static final String TASK_TYPE_SINGLE_DATA_AND_MORE_ALGORITHM = "2";
+//    public static final String TASK_ITEM_TRAIN = "1";
+//    public static final String TASK_ITEM_TEST = "2";
+
+    // 任务名称
+    private String taskName;
+
+    // 任务类型 target_identification_task_type 单数据多算法任务:1,多数据单算法任务:2
+    private String taskType;
+
+    // 算法任务 target_identification_task_item 1训练,2测试
+    private List<String> taskItemList;
+
+    // 选择算法
+    private List<TaskDto> algTaskList;
+    //训练数据 ["批次号1,批次号2","批次号3,批次号4","批次号1,批次号3"]
+    private List<String> trainBatchNumList;
+
+    //训练数据 ["批次号1,批次号2","批次号3,批次号4","批次号1,批次号3"]
+    private List<String> testBatchNumList;
+
+    // 是否训练扩增
+    private Boolean hasTrainAugmentation;
+
+    // 训练扩增的超参
+    private String trainAugmentationParams;
+}

+ 64 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationImportVo.java

@@ -0,0 +1,64 @@
+package com.taais.biz.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.NoArgsConstructor;
+
+/**
+ * 算法任务导入视图对象 algorithm_task_configuration
+ *
+ * @author 0
+ * @date 2024-08-23
+ */
+
+@Data
+@NoArgsConstructor
+public class AlgorithmTaskConfigurationImportVo implements Serializable
+{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+     /** 算法任务名称 */
+    @ExcelProperty(value = "算法任务名称")
+    private String name;
+
+     /** 训练算法地址 */
+    @ExcelProperty(value = "训练算法地址")
+    private String trainUrl;
+
+     /** 训练超参配置 */
+    @ExcelProperty(value = "训练超参配置")
+    private String trainParams;
+
+     /** 验证算法地址 */
+    @ExcelProperty(value = "验证算法地址")
+    private String verifyUrl;
+
+     /** 验证超参配置 */
+    @ExcelProperty(value = "验证超参配置")
+    private String verifyParams;
+
+     /** 测试算法地址 */
+    @ExcelProperty(value = "测试算法地址")
+    private String testUrl;
+
+     /** 测试超参配置 */
+    @ExcelProperty(value = "测试超参配置")
+    private String testParams;
+
+     /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+     /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+
+}

+ 74 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationVo.java

@@ -0,0 +1,74 @@
+package com.taais.biz.domain.vo;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.KeyType;
+import com.taais.biz.domain.AlgorithmTaskConfiguration;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serial;
+import java.io.Serializable;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 算法任务视图对象 algorithm_task_configuration
+ *
+ * @author 0
+ * @date 2024-08-23
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AlgorithmTaskConfiguration.class)
+public class AlgorithmTaskConfigurationVo extends BaseEntity implements Serializable {
+
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /** 算法任务名称 */
+    @ExcelProperty(value = "算法任务名称")
+    private String name;
+
+    /** 训练算法地址 */
+    @ExcelProperty(value = "训练算法地址")
+    private String trainUrl;
+
+    /** 训练超参配置 */
+    @ExcelProperty(value = "训练超参配置")
+    private String trainParams;
+
+    /** 验证算法地址 */
+    @ExcelProperty(value = "验证算法地址")
+    private String verifyUrl;
+
+    /** 验证超参配置 */
+    @ExcelProperty(value = "验证超参配置")
+    private String verifyParams;
+
+    /** 测试算法地址 */
+    @ExcelProperty(value = "测试算法地址")
+    private String testUrl;
+
+    /** 测试超参配置 */
+    @ExcelProperty(value = "测试超参配置")
+    private String testParams;
+
+    /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+
+
+}

+ 30 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/BatchDataResult.java

@@ -0,0 +1,30 @@
+package com.taais.biz.domain.vo;
+
+/**
+ * @author SukangLee
+ * @version 1.0
+ * @date 2024/8/23 14:41
+ * @description
+ */
+public class BatchDataResult {
+    // 批次号
+    private String batchNum;
+    // 批次数量
+    private Long batchSize;
+
+    public String getBatchNum() {
+        return batchNum;
+    }
+
+    public void setBatchNum(String batchNum) {
+        this.batchNum = batchNum;
+    }
+
+    public Long getBatchSize() {
+        return batchSize;
+    }
+
+    public void setBatchSize(Long batchSize) {
+        this.batchSize = batchSize;
+    }
+}

+ 9 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataSelectVo.java

@@ -0,0 +1,9 @@
+package com.taais.biz.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class DataSelectVo{
+    private String label;
+    private String value;
+}

+ 85 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsImportVo.java

@@ -0,0 +1,85 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.NoArgsConstructor;
+
+/**
+ * 目标识别子任务导入视图对象 target_identification_subtask_details
+ *
+ * @author 0
+ * @date 2024-08-17
+ */
+
+@Data
+@NoArgsConstructor
+public class TargetIdentificationSubtaskDetailsImportVo implements Serializable
+{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+     /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+     /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+     /** 算法 */
+    @ExcelProperty(value = "算法")
+    private Long algorithmId;
+
+     /** 数据批次号 */
+    @ExcelProperty(value = "数据批次号")
+    private String dataBatchNums;
+
+     /** 调用算法时所用的参数 */
+    @ExcelProperty(value = "调用算法时所用的参数")
+    private String parameters;
+
+     /** 预处理数据路径 */
+    @ExcelProperty(value = "预处理数据路径")
+    private String preprocessPath;
+
+     /** 结果数据路径 */
+    @ExcelProperty(value = "结果数据路径")
+    private String resultPath;
+
+     /** 序号 */
+    @ExcelProperty(value = "序号")
+    private Long index;
+
+     /** 开始时间 */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+     /** 结束时间 */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+     /** 耗时 */
+    @ExcelProperty(value = "耗时")
+    private Long costSecond;
+
+     /** $column.columnComment */
+    @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "$column.readConverterExp()")
+    private String log;
+
+     /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+     /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+}

+ 95 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsVo.java

@@ -0,0 +1,95 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+
+import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serial;
+import java.io.Serializable;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别子任务视图对象 target_identification_subtask_details
+ *
+ * @author 0
+ * @date 2024-08-17
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TargetIdentificationSubtaskDetails.class)
+public class TargetIdentificationSubtaskDetailsVo extends BaseEntity implements Serializable {
+
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    // 子任务id
+    private Long subtaskId;
+
+    /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+    /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+    /** 算法 */
+    @ExcelProperty(value = "算法")
+    private Long algorithmId;
+
+    /** 数据批次号 */
+    @ExcelProperty(value = "数据批次号")
+    private String dataBatchNums;
+
+    /** 调用算法时所用的参数 */
+    @ExcelProperty(value = "调用算法时所用的参数")
+    private String parameters;
+
+    /** 预处理数据路径 */
+    @ExcelProperty(value = "预处理数据路径")
+    private String preprocessPath;
+
+    /** 结果数据路径 */
+    @ExcelProperty(value = "结果数据路径")
+    private String resultPath;
+
+    /** 序号 */
+    @ExcelProperty(value = "序号")
+    private Long index;
+
+    /** 开始时间 */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /** 结束时间 */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+    /** 耗时 */
+    @ExcelProperty(value = "耗时")
+    private Long costSecond;
+
+    /** $column.columnComment */
+    @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "$column.readConverterExp()")
+    private String log;
+
+    /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+}

+ 42 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskImportVo.java

@@ -0,0 +1,42 @@
+package com.taais.biz.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.NoArgsConstructor;
+
+/**
+ * 目标识别子任务导入视图对象 target_identification_subtask
+ *
+ * @author Allen
+ * @date 2024-08-17
+ */
+
+@Data
+@NoArgsConstructor
+public class TargetIdentificationSubtaskImportVo implements Serializable
+{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+     /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+     /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+     /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+     /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+}

+ 53 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskVo.java

@@ -0,0 +1,53 @@
+package com.taais.biz.domain.vo;
+
+import com.taais.biz.domain.TargetIdentificationSubtask;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serial;
+import java.io.Serializable;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别子任务视图对象 target_identification_subtask
+ *
+ * @author Allen
+ * @date 2024-08-17
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TargetIdentificationSubtask.class)
+public class TargetIdentificationSubtaskVo extends BaseEntity implements Serializable {
+
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    // 任务id
+    private Long taskId;
+
+    /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+    /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+    /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+}

+ 42 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskImportVo.java

@@ -0,0 +1,42 @@
+package com.taais.biz.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.NoArgsConstructor;
+
+/**
+ * 目标识别任务导入视图对象 target_identification_task
+ *
+ * @author km
+ * @date 2024-08-17
+ */
+
+@Data
+@NoArgsConstructor
+public class TargetIdentificationTaskImportVo implements Serializable
+{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+     /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+     /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+     /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+     /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+}

+ 50 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskVo.java

@@ -0,0 +1,50 @@
+package com.taais.biz.domain.vo;
+
+import com.taais.biz.domain.TargetIdentificationTask;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.common.excel.annotation.ExcelDictFormat;
+import com.taais.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serial;
+import java.io.Serializable;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 目标识别任务视图对象 target_identification_task
+ *
+ * @author km
+ * @date 2024-08-17
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TargetIdentificationTask.class)
+public class TargetIdentificationTaskVo extends BaseEntity implements Serializable {
+
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+    /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+    /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+}

+ 119 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/listener/AlgorithmTaskConfigurationImportListener.java

@@ -0,0 +1,119 @@
+package com.taais.biz.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.taais.common.core.exception.ServiceException;
+import com.taais.common.core.utils.SpringUtils;
+import com.taais.common.core.utils.ValidatorUtils;
+import com.taais.common.excel.core.ExcelListener;
+import com.taais.common.excel.core.ExcelResult;
+import com.taais.biz.domain.bo.AlgorithmTaskConfigurationBo;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationImportVo;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.biz.service.IAlgorithmTaskConfigurationService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 算法任务自定义导入
+ *
+ * @author 0
+ */
+@Slf4j
+public class AlgorithmTaskConfigurationImportListener extends AnalysisEventListener<AlgorithmTaskConfigurationImportVo> implements ExcelListener<AlgorithmTaskConfigurationImportVo> {
+    private final IAlgorithmTaskConfigurationService algorithmTaskConfigurationService;
+
+    private final Boolean isUpdateSupport;
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public AlgorithmTaskConfigurationImportListener(Boolean isUpdateSupport) {
+        this.algorithmTaskConfigurationService = SpringUtils.getBean(IAlgorithmTaskConfigurationService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(AlgorithmTaskConfigurationImportVo algorithmTaskConfigurationVo, AnalysisContext context) {
+        try {
+
+            AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo = BeanUtil.toBean(algorithmTaskConfigurationVo, AlgorithmTaskConfigurationBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            AlgorithmTaskConfigurationVo algorithmTaskConfigurationVo1 = null;
+
+            //algorithmTaskConfigurationVo1 = algorithmTaskConfigurationService.selectBySomefield(algorithmTaskConfigurationVo.getSomefield());
+            if (ObjectUtil.isNull(algorithmTaskConfigurationVo1)) {
+                //不存在就新增
+                algorithmTaskConfigurationBo.setVersion(0);
+                ValidatorUtils.validate(algorithmTaskConfigurationBo);
+                boolean inserted = algorithmTaskConfigurationService.insert(algorithmTaskConfigurationBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、算法任务 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、算法任务 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                algorithmTaskConfigurationBo.setId(algorithmTaskConfigurationVo1.getId());//主键
+                algorithmTaskConfigurationBo.setVersion(algorithmTaskConfigurationVo1.getVersion());
+                boolean updated = algorithmTaskConfigurationService.update(algorithmTaskConfigurationBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、算法任务 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、算法任务 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、算法任务 记录导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+
+    }
+
+    @Override
+    public ExcelResult<AlgorithmTaskConfigurationImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<AlgorithmTaskConfigurationImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 119 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskDetailsImportListener.java

@@ -0,0 +1,119 @@
+package com.taais.biz.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.taais.common.core.exception.ServiceException;
+import com.taais.common.core.utils.SpringUtils;
+import com.taais.common.core.utils.ValidatorUtils;
+import com.taais.common.excel.core.ExcelListener;
+import com.taais.common.excel.core.ExcelResult;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsImportVo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
+import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 目标识别子任务自定义导入
+ *
+ * @author 0
+ */
+@Slf4j
+public class TargetIdentificationSubtaskDetailsImportListener extends AnalysisEventListener<TargetIdentificationSubtaskDetailsImportVo> implements ExcelListener<TargetIdentificationSubtaskDetailsImportVo> {
+    private final ITargetIdentificationSubtaskDetailsService targetIdentificationSubtaskDetailsService;
+
+    private final Boolean isUpdateSupport;
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public TargetIdentificationSubtaskDetailsImportListener(Boolean isUpdateSupport) {
+        this.targetIdentificationSubtaskDetailsService = SpringUtils.getBean(ITargetIdentificationSubtaskDetailsService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(TargetIdentificationSubtaskDetailsImportVo targetIdentificationSubtaskDetailsVo, AnalysisContext context) {
+        try {
+
+            TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo = BeanUtil.toBean(targetIdentificationSubtaskDetailsVo, TargetIdentificationSubtaskDetailsBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            TargetIdentificationSubtaskDetailsVo targetIdentificationSubtaskDetailsVo1 = null;
+
+            //targetIdentificationSubtaskDetailsVo1 = targetIdentificationSubtaskDetailsService.selectBySomefield(targetIdentificationSubtaskDetailsVo.getSomefield());
+            if (ObjectUtil.isNull(targetIdentificationSubtaskDetailsVo1)) {
+                //不存在就新增
+                targetIdentificationSubtaskDetailsBo.setVersion(0);
+                ValidatorUtils.validate(targetIdentificationSubtaskDetailsBo);
+                boolean inserted = targetIdentificationSubtaskDetailsService.insert(targetIdentificationSubtaskDetailsBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、目标识别子任务 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、目标识别子任务 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                targetIdentificationSubtaskDetailsBo.setId(targetIdentificationSubtaskDetailsVo1.getId());//主键
+                targetIdentificationSubtaskDetailsBo.setVersion(targetIdentificationSubtaskDetailsVo1.getVersion());
+                boolean updated = targetIdentificationSubtaskDetailsService.update(targetIdentificationSubtaskDetailsBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、目标识别子任务 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、目标识别子任务 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、目标识别子任务 记录导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+
+    }
+
+    @Override
+    public ExcelResult<TargetIdentificationSubtaskDetailsImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<TargetIdentificationSubtaskDetailsImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 119 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskImportListener.java

@@ -0,0 +1,119 @@
+package com.taais.biz.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.taais.common.core.exception.ServiceException;
+import com.taais.common.core.utils.SpringUtils;
+import com.taais.common.core.utils.ValidatorUtils;
+import com.taais.common.excel.core.ExcelListener;
+import com.taais.common.excel.core.ExcelResult;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskImportVo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskVo;
+import com.taais.biz.service.ITargetIdentificationSubtaskService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 目标识别子任务自定义导入
+ *
+ * @author Allen
+ */
+@Slf4j
+public class TargetIdentificationSubtaskImportListener extends AnalysisEventListener<TargetIdentificationSubtaskImportVo> implements ExcelListener<TargetIdentificationSubtaskImportVo> {
+    private final ITargetIdentificationSubtaskService targetIdentificationSubtaskService;
+
+    private final Boolean isUpdateSupport;
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public TargetIdentificationSubtaskImportListener(Boolean isUpdateSupport) {
+        this.targetIdentificationSubtaskService = SpringUtils.getBean(ITargetIdentificationSubtaskService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(TargetIdentificationSubtaskImportVo targetIdentificationSubtaskVo, AnalysisContext context) {
+        try {
+
+            TargetIdentificationSubtaskBo targetIdentificationSubtaskBo = BeanUtil.toBean(targetIdentificationSubtaskVo, TargetIdentificationSubtaskBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            TargetIdentificationSubtaskVo targetIdentificationSubtaskVo1 = null;
+
+            //targetIdentificationSubtaskVo1 = targetIdentificationSubtaskService.selectBySomefield(targetIdentificationSubtaskVo.getSomefield());
+            if (ObjectUtil.isNull(targetIdentificationSubtaskVo1)) {
+                //不存在就新增
+                targetIdentificationSubtaskBo.setVersion(0);
+                ValidatorUtils.validate(targetIdentificationSubtaskBo);
+                boolean inserted = targetIdentificationSubtaskService.insert(targetIdentificationSubtaskBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、目标识别子任务 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、目标识别子任务 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                targetIdentificationSubtaskBo.setId(targetIdentificationSubtaskVo1.getId());//主键
+                targetIdentificationSubtaskBo.setVersion(targetIdentificationSubtaskVo1.getVersion());
+                boolean updated = targetIdentificationSubtaskService.update(targetIdentificationSubtaskBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、目标识别子任务 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、目标识别子任务 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、目标识别子任务 记录导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+
+    }
+
+    @Override
+    public ExcelResult<TargetIdentificationSubtaskImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<TargetIdentificationSubtaskImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 119 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationTaskImportListener.java

@@ -0,0 +1,119 @@
+package com.taais.biz.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.taais.common.core.exception.ServiceException;
+import com.taais.common.core.utils.SpringUtils;
+import com.taais.common.core.utils.ValidatorUtils;
+import com.taais.common.excel.core.ExcelListener;
+import com.taais.common.excel.core.ExcelResult;
+import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
+import com.taais.biz.domain.vo.TargetIdentificationTaskImportVo;
+import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
+import com.taais.biz.service.ITargetIdentificationTaskService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 目标识别任务自定义导入
+ *
+ * @author km
+ */
+@Slf4j
+public class TargetIdentificationTaskImportListener extends AnalysisEventListener<TargetIdentificationTaskImportVo> implements ExcelListener<TargetIdentificationTaskImportVo> {
+    private final ITargetIdentificationTaskService targetIdentificationTaskService;
+
+    private final Boolean isUpdateSupport;
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public TargetIdentificationTaskImportListener(Boolean isUpdateSupport) {
+        this.targetIdentificationTaskService = SpringUtils.getBean(ITargetIdentificationTaskService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(TargetIdentificationTaskImportVo targetIdentificationTaskVo, AnalysisContext context) {
+        try {
+
+            TargetIdentificationTaskBo targetIdentificationTaskBo = BeanUtil.toBean(targetIdentificationTaskVo, TargetIdentificationTaskBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            TargetIdentificationTaskVo targetIdentificationTaskVo1 = null;
+
+            //targetIdentificationTaskVo1 = targetIdentificationTaskService.selectBySomefield(targetIdentificationTaskVo.getSomefield());
+            if (ObjectUtil.isNull(targetIdentificationTaskVo1)) {
+                //不存在就新增
+                targetIdentificationTaskBo.setVersion(0);
+                ValidatorUtils.validate(targetIdentificationTaskBo);
+                boolean inserted = targetIdentificationTaskService.insert(targetIdentificationTaskBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、目标识别任务 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、目标识别任务 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                targetIdentificationTaskBo.setId(targetIdentificationTaskVo1.getId());//主键
+                targetIdentificationTaskBo.setVersion(targetIdentificationTaskVo1.getVersion());
+                boolean updated = targetIdentificationTaskService.update(targetIdentificationTaskBo);
+                if (updated) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、目标识别任务 记录更新成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、目标识别任务 记录更新失败");
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、目标识别任务 记录导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+
+    }
+
+    @Override
+    public ExcelResult<TargetIdentificationTaskImportVo> getExcelResult() {
+        return new ExcelResult<>() {
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<TargetIdentificationTaskImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 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);
 }

+ 16 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmTaskConfigurationMapper.java

@@ -0,0 +1,16 @@
+package com.taais.biz.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import com.taais.biz.domain.AlgorithmTaskConfiguration;
+
+/**
+ * 算法任务Mapper接口
+ *
+ * @author 0
+ * 2024-08-23
+ */
+@Mapper
+public interface AlgorithmTaskConfigurationMapper extends BaseMapper<AlgorithmTaskConfiguration> {
+
+}

+ 7 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/DataMapper.java

@@ -1,10 +1,13 @@
 package com.taais.biz.mapper;
 
 import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.vo.DataSelectVo;
+import com.taais.biz.domain.vo.BatchDataResult;
 import org.apache.ibatis.annotations.Mapper;
 import com.taais.biz.domain.Data;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -17,4 +20,8 @@ import java.util.List;
 public interface DataMapper extends BaseMapper<Data> {
 
     List<Long> getIds(@Param("size") Integer size);
+
+    List<BatchDataResult> getBatchData();
+
+    List<DataSelectVo> getFormSelects(@Param("field") String field);
 }

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

@@ -0,0 +1,21 @@
+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接口
+ *
+ * @author 0
+ * 2024-08-17
+ */
+@Mapper
+public interface TargetIdentificationSubtaskDetailsMapper extends BaseMapper<TargetIdentificationSubtaskDetails> {
+
+    List<TargetIdentificationSubtaskDetailsBo> getTargetIdentificationSubtaskDetailsListBySubtaskId(Long subtaskId);
+}

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

@@ -0,0 +1,16 @@
+package com.taais.biz.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import com.taais.biz.domain.TargetIdentificationSubtask;
+
+/**
+ * 目标识别子任务Mapper接口
+ *
+ * @author Allen
+ * 2024-08-17
+ */
+@Mapper
+public interface TargetIdentificationSubtaskMapper extends BaseMapper<TargetIdentificationSubtask> {
+    TargetIdentificationSubtask getAvailableSubtask(long taskId);
+}

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

@@ -0,0 +1,16 @@
+package com.taais.biz.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import com.taais.biz.domain.TargetIdentificationTask;
+
+/**
+ * 目标识别任务Mapper接口
+ *
+ * @author km
+ * 2024-08-17
+ */
+@Mapper
+public interface TargetIdentificationTaskMapper extends BaseMapper<TargetIdentificationTask> {
+    TargetIdentificationTask getAvailableTask();
+}

+ 66 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmTaskConfigurationService.java

@@ -0,0 +1,66 @@
+package com.taais.biz.service;
+
+import java.util.List;
+
+import com.taais.biz.domain.AlgorithmTaskConfiguration;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.biz.domain.bo.AlgorithmTaskConfigurationBo;
+import com.taais.common.orm.core.service.IBaseService;
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 算法任务Service接口
+ *
+ * @author 0
+ * 2024-08-23
+ */
+public interface IAlgorithmTaskConfigurationService extends IBaseService<AlgorithmTaskConfiguration> {
+    /**
+     * 查询算法任务
+     *
+     * @param id 算法任务主键
+     * @return 算法任务
+     */
+        AlgorithmTaskConfigurationVo selectById(Long id);
+
+    /**
+     * 查询算法任务列表
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 算法任务集合
+     */
+    List<AlgorithmTaskConfigurationVo> selectList(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo);
+
+    /**
+     * 分页查询算法任务列表
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 分页算法任务集合
+     */
+    PageResult<AlgorithmTaskConfigurationVo> selectPage(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo);
+
+    /**
+     * 新增算法任务
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo);
+
+    /**
+     * 修改算法任务
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo);
+
+    /**
+     * 批量删除算法任务
+     *
+     * @param ids 需要删除的算法任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+}

+ 19 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java

@@ -1,8 +1,12 @@
 package com.taais.biz.service;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import com.taais.biz.domain.Data;
+import com.taais.biz.domain.vo.BatchDataResult;
+import com.taais.biz.domain.vo.DataSelectVo;
 import com.taais.biz.domain.vo.DataVo;
 import com.taais.biz.domain.bo.DataBo;
 import com.taais.common.core.core.domain.CommonResult;
@@ -17,6 +21,13 @@ import org.springframework.web.multipart.MultipartFile;
  * 2024-06-14
  */
 public interface IDataService extends IBaseService<Data> {
+    /**
+     * 查询批次情况
+     *
+     * @return 数据批次信息
+     */
+    List<BatchDataResult> batchSelect();
+
     /**
      * 查询数据管理
      *
@@ -75,4 +86,12 @@ public interface IDataService extends IBaseService<Data> {
     boolean deleteByIds(Long[] ids);
 
     List<Data> selectByIds(List<Long> ids);
+
+    /**
+     * 根据传入字段 获取数据库中所有该字段的类型
+     *
+     * @param field 字段
+     * @return {@link List }<{@link String }>
+     */
+    List<DataSelectVo>  getFormSelects(String field);
 }

+ 66 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskDetailsService.java

@@ -0,0 +1,66 @@
+package com.taais.biz.service;
+
+import java.util.List;
+
+import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.common.orm.core.service.IBaseService;
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 目标识别子任务Service接口
+ *
+ * @author 0
+ * 2024-08-17
+ */
+public interface ITargetIdentificationSubtaskDetailsService extends IBaseService<TargetIdentificationSubtaskDetails> {
+    /**
+     * 查询目标识别子任务
+     *
+     * @param id 目标识别子任务主键
+     * @return 目标识别子任务
+     */
+        TargetIdentificationSubtaskDetailsVo selectById(Long id);
+
+    /**
+     * 查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 目标识别子任务集合
+     */
+    List<TargetIdentificationSubtaskDetailsVo> selectList(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo);
+
+    /**
+     * 分页查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 分页目标识别子任务集合
+     */
+    PageResult<TargetIdentificationSubtaskDetailsVo> selectPage(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo);
+
+    /**
+     * 新增目标识别子任务
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo);
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo);
+
+    /**
+     * 批量删除目标识别子任务
+     *
+     * @param ids 需要删除的目标识别子任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+}

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

@@ -0,0 +1,71 @@
+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;
+
+/**
+ * 目标识别子任务Service接口
+ *
+ * @author Allen
+ * 2024-08-17
+ */
+public interface ITargetIdentificationSubtaskService extends IBaseService<TargetIdentificationSubtask> {
+    /**
+     * 查询目标识别子任务
+     *
+     * @param id 目标识别子任务主键
+     * @return 目标识别子任务
+     */
+        TargetIdentificationSubtaskVo selectById(Long id);
+
+    /**
+     * 查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 目标识别子任务集合
+     */
+    List<TargetIdentificationSubtaskVo> selectList(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
+    /**
+     * 分页查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 分页目标识别子任务集合
+     */
+    PageResult<TargetIdentificationSubtaskVo> selectPage(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
+    /**
+     * 新增目标识别子任务
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
+    TargetIdentificationSubtask insertSubtask(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
+    /**
+     * 批量删除目标识别子任务
+     *
+     * @param ids 需要删除的目标识别子任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    void taskRun(TargetIdentificationTask task);
+}

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

@@ -0,0 +1,70 @@
+package com.taais.biz.service;
+
+import java.util.List;
+
+import com.taais.biz.domain.TargetIdentificationTask;
+import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
+import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
+import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
+import com.taais.common.orm.core.service.IBaseService;
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 目标识别任务Service接口
+ *
+ * @author km
+ * 2024-08-17
+ */
+public interface ITargetIdentificationTaskService extends IBaseService<TargetIdentificationTask> {
+    /**
+     * 查询目标识别任务
+     *
+     * @param id 目标识别任务主键
+     * @return 目标识别任务
+     */
+        TargetIdentificationTaskVo selectById(Long id);
+
+    /**
+     * 查询目标识别任务列表
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 目标识别任务集合
+     */
+    List<TargetIdentificationTaskVo> selectList(TargetIdentificationTaskBo targetIdentificationTaskBo);
+
+    /**
+     * 分页查询目标识别任务列表
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 分页目标识别任务集合
+     */
+    PageResult<TargetIdentificationTaskVo> selectPage(TargetIdentificationTaskBo targetIdentificationTaskBo);
+
+    /**
+     * 新增目标识别任务
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(TargetIdentificationTaskBo targetIdentificationTaskBo);
+
+    /**
+     * 修改目标识别任务
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(TargetIdentificationTaskBo targetIdentificationTaskBo);
+
+    /**
+     * 批量删除目标识别任务
+     *
+     * @param ids 需要删除的目标识别任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    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);
     }
 
     /**

+ 138 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmTaskConfigurationServiceImpl.java

@@ -0,0 +1,138 @@
+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.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 jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.taais.biz.mapper.AlgorithmTaskConfigurationMapper;
+import com.taais.biz.domain.AlgorithmTaskConfiguration;
+import com.taais.biz.domain.bo.AlgorithmTaskConfigurationBo;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.biz.service.IAlgorithmTaskConfigurationService;
+import static com.taais.biz.domain.table.AlgorithmTaskConfigurationTableDef.ALGORITHM_TASK_CONFIGURATION;
+
+/**
+ * 算法任务Service业务层处理
+ *
+ * @author 0
+ * 2024-08-23
+ */
+@Service
+public class AlgorithmTaskConfigurationServiceImpl extends BaseServiceImpl<AlgorithmTaskConfigurationMapper, AlgorithmTaskConfiguration> implements IAlgorithmTaskConfigurationService {
+    @Resource
+    private AlgorithmTaskConfigurationMapper algorithmTaskConfigurationMapper;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(ALGORITHM_TASK_CONFIGURATION);
+    }
+
+    private QueryWrapper buildQueryWrapper(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.NAME.like
+        (algorithmTaskConfigurationBo.getName()));
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.TRAIN_URL.eq
+        (algorithmTaskConfigurationBo.getTrainUrl()));
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.TRAIN_PARAMS.eq
+        (algorithmTaskConfigurationBo.getTrainParams()));
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.VERIFY_URL.eq
+        (algorithmTaskConfigurationBo.getVerifyUrl()));
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.VERIFY_PARAMS.eq
+        (algorithmTaskConfigurationBo.getVerifyParams()));
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.TEST_URL.eq
+        (algorithmTaskConfigurationBo.getTestUrl()));
+        queryWrapper.and(ALGORITHM_TASK_CONFIGURATION.TEST_PARAMS.eq
+        (algorithmTaskConfigurationBo.getTestParams()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询算法任务
+     *
+     * @param id 算法任务主键
+     * @return 算法任务
+     */
+    @Override
+    public AlgorithmTaskConfigurationVo selectById(Long id) {
+            return this.getOneAs(query().where(ALGORITHM_TASK_CONFIGURATION.ID.eq(id)), AlgorithmTaskConfigurationVo.class);
+
+    }
+
+    /**
+     * 查询算法任务列表
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 算法任务集合
+     */
+    @Override
+    public List<AlgorithmTaskConfigurationVo> selectList(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(algorithmTaskConfigurationBo);
+            return this.listAs(queryWrapper, AlgorithmTaskConfigurationVo.class);
+    }
+
+    /**
+     * 分页查询算法任务列表
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 分页算法任务集合
+     */
+    @Override
+    public PageResult<AlgorithmTaskConfigurationVo> selectPage(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(algorithmTaskConfigurationBo);
+            Page<AlgorithmTaskConfigurationVo> page = this.pageAs(PageQuery.build(), queryWrapper, AlgorithmTaskConfigurationVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增算法任务
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+    AlgorithmTaskConfiguration algorithmTaskConfiguration =MapstructUtils.convert(algorithmTaskConfigurationBo, AlgorithmTaskConfiguration. class);
+
+        return this.save(algorithmTaskConfiguration);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 修改算法任务
+     *
+     * @param algorithmTaskConfigurationBo 算法任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(AlgorithmTaskConfigurationBo algorithmTaskConfigurationBo) {
+        AlgorithmTaskConfiguration algorithmTaskConfiguration =MapstructUtils.convert(algorithmTaskConfigurationBo, AlgorithmTaskConfiguration. class);
+        if (ObjectUtil.isNotNull(algorithmTaskConfiguration) && ObjectUtil.isNotNull(algorithmTaskConfiguration.getId())){
+            boolean updated = this.updateById(algorithmTaskConfiguration);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除算法任务
+     *
+     * @param ids 需要删除的算法任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 73 - 21
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java

@@ -5,6 +5,8 @@ import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
 import com.taais.biz.domain.Data;
 import com.taais.biz.domain.bo.DataBo;
+import com.taais.biz.domain.vo.BatchDataResult;
+import com.taais.biz.domain.vo.DataSelectVo;
 import com.taais.biz.domain.vo.DataVo;
 import com.taais.biz.mapper.DataMapper;
 import com.taais.biz.service.IDataService;
@@ -18,8 +20,10 @@ import com.taais.common.core.utils.file.FileUtils;
 import com.taais.common.core.utils.file.UnPackedUtil;
 import com.taais.common.orm.core.page.PageQuery;
 import com.taais.common.orm.core.service.impl.BaseServiceImpl;
+import com.taais.common.redis.utils.RedisUtils;
 import jakarta.annotation.Resource;
 import net.lingala.zip4j.model.FileHeader;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -33,7 +37,10 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.time.Instant;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static com.taais.biz.domain.table.DataTableDef.DATA;
@@ -46,6 +53,8 @@ import static com.taais.biz.domain.table.DataTableDef.DATA;
  */
 @Service
 public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implements IDataService {
+
+    public static final String FORM_SELECTS_KEY = "taais:biz:demo:data:formSelect:";
     private static final Logger log = LoggerFactory.getLogger(DataServiceImpl.class);
     private static final String ZIP = ".zip";
     private static final String RAR = ".rar";
@@ -62,37 +71,42 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
     private QueryWrapper buildQueryWrapper(DataBo dataBo) {
         QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
         queryWrapper.and(DATA.NAME.like
-                (dataBo.getName()));
-        queryWrapper.and(DATA.DATA_TYPE.eq
-                (dataBo.getDataType()));
-        queryWrapper.and(DATA.FILE_TYPE.eq
-                (dataBo.getFileType()));
+            (dataBo.getName()));
+//        queryWrapper.and(DATA.DATA_TYPE.eq
+//                (dataBo.getDataType()));
+//        queryWrapper.and(DATA.FILE_TYPE.eq
+//                (dataBo.getFileType()));
         queryWrapper.and(DATA.OBJECT_TYPE.eq
-                (dataBo.getObjectType()));
+            (dataBo.getObjectType()));
         queryWrapper.and(DATA.OBJECT_SUBTYPE.eq
-                (dataBo.getObjectSubtype()));
+            (dataBo.getObjectSubtype()));
         queryWrapper.and(DATA.BATCH_NUM.eq
-                (dataBo.getBatchNum()));
+            (dataBo.getBatchNum()));
         queryWrapper.and(DATA.SCENE.eq
-                (dataBo.getScene()));
+            (dataBo.getScene()));
         queryWrapper.and(DATA.DATA_SOURCE.eq
-                (dataBo.getDataSource()));
+            (dataBo.getDataSource()));
         queryWrapper.and(DATA.GATHER_TIME.eq
-                (dataBo.getGatherTime()));
+            (dataBo.getGatherTime()));
         queryWrapper.and(DATA.GATHER_SPOT.eq
-                (dataBo.getGatherSpot()));
+            (dataBo.getGatherSpot()));
         queryWrapper.and(DATA.URL.eq
-                (dataBo.getUrl()));
+            (dataBo.getUrl()));
         queryWrapper.and(DATA.LABELURL.eq
-                (dataBo.getLabelurl()));
-        queryWrapper.and(DATA.INCREMENT.eq
-                (dataBo.getIncrement()));
+            (dataBo.getLabelurl()));
+//        queryWrapper.and(DATA.INCREMENT.eq
+//                (dataBo.getIncrement()));
         queryWrapper.and(DATA.LABELED.eq
-                (dataBo.getLabeled()));
+            (dataBo.getLabeled()));
 
         return queryWrapper;
     }
 
+    @Override
+    public List<BatchDataResult> batchSelect() {
+        return dataMapper.getBatchData();
+    }
+
     /**
      * 查询数据管理
      *
@@ -102,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);
     }
 
     /**
@@ -187,8 +204,8 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
                     Path path = Paths.get(fileInfo.getAbsolutePath());
                     // 使用Files类的readAttributes方法获取文件的基本属性
                     BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
-                    // 获取文件的创建时间
-                    Instant creationTime = attrs.creationTime().toInstant();
+                    // 获取文件的修改时间
+                    Instant creationTime = attrs.lastModifiedTime().toInstant();
                     // 将Instant转换为Date
                     Date date = Date.from(creationTime);
                     //设置文件创建时间
@@ -278,10 +295,26 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
     @Override
     public boolean insert(DataBo dataBo) {
         Data data = MapstructUtils.convert(dataBo, Data.class);
-
+        //新增之后清除缓存
+        deleteFormSelectKey();
         return this.save(data);//使用全局配置的雪花算法主键生成器生成ID值
     }
 
+    private void deleteFormSelectKey() {
+//        RedisUtils.deleteKeys(); 方法不知道为什么失效
+        String[] keys = {"increment",
+            "scene",
+            "data_source",
+            "object_type",
+            "batch_num",
+            "object_subtype",
+            "gather_spot"};
+        RedissonClient client = RedisUtils.getClient();
+        for (String key : keys) {
+            client.getBucket(FORM_SELECTS_KEY + key).delete();
+        }
+    }
+
     /**
      * 修改数据管理
      *
@@ -293,8 +326,12 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
         Data data = MapstructUtils.convert(dataBo, Data.class);
         if (ObjectUtil.isNotNull(data) && ObjectUtil.isNotNull(data.getId())) {
             boolean updated = this.updateById(data);
+            //新增之后清除缓存
+            deleteFormSelectKey();
             return updated;
         }
+        //新增之后清除缓存
+        deleteFormSelectKey();
         return false;
     }
 
@@ -308,6 +345,8 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
     @Override
     public boolean deleteByIds(Long[] ids) {
         QueryWrapper queryWrapper = QueryWrapper.create().from(DATA).where(DATA.ID.in(Arrays.asList(ids)));
+        //新增之后清除缓存
+        deleteFormSelectKey();
         return this.remove(queryWrapper);
     }
 
@@ -316,4 +355,17 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
         return this.listByIds(ids);
     }
 
+    @Override
+    public List<DataSelectVo> getFormSelects(String field) {
+        String cacheKey = FORM_SELECTS_KEY + field;
+        List<DataSelectVo> cacheList = RedisUtils.getCacheList(cacheKey);
+        if (cacheList == null || cacheList.isEmpty()) {
+            cacheList = dataMapper.getFormSelects(field);
+            RedisUtils.setCacheList(cacheKey, cacheList);
+//            RedisUtils.expire(cacheKey, 60);
+        }
+        return cacheList;
+    }
+
+
 }

+ 159 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java

@@ -0,0 +1,159 @@
+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.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 jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.taais.biz.mapper.TargetIdentificationSubtaskDetailsMapper;
+import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
+import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
+import static com.taais.biz.domain.table.TargetIdentificationSubtaskDetailsTableDef.TARGET_IDENTIFICATION_SUBTASK_DETAILS;
+
+/**
+ * 目标识别子任务Service业务层处理
+ *
+ * @author 0
+ * 2024-08-17
+ */
+@Service
+public class TargetIdentificationSubtaskDetailsServiceImpl extends BaseServiceImpl<TargetIdentificationSubtaskDetailsMapper, TargetIdentificationSubtaskDetails> implements ITargetIdentificationSubtaskDetailsService {
+    @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);
+    }
+
+    private QueryWrapper buildQueryWrapper(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        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
+        (targetIdentificationSubtaskDetailsBo.getAlgorithmId()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.DATA_BATCH_NUMS.eq
+        (targetIdentificationSubtaskDetailsBo.getDataBatchNums()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.PARAMETERS.eq
+        (targetIdentificationSubtaskDetailsBo.getParameters()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.PREPROCESS_PATH.eq
+        (targetIdentificationSubtaskDetailsBo.getPreprocessPath()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.RESULT_PATH.eq
+        (targetIdentificationSubtaskDetailsBo.getResultPath()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.INDEX.eq
+        (targetIdentificationSubtaskDetailsBo.getIndex()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.START_TIME.eq
+        (targetIdentificationSubtaskDetailsBo.getStartTime()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.END_TIME.eq
+        (targetIdentificationSubtaskDetailsBo.getEndTime()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.COST_SECOND.eq
+        (targetIdentificationSubtaskDetailsBo.getCostSecond()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.LOG.eq
+        (targetIdentificationSubtaskDetailsBo.getLog()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.REMARKS.eq
+        (targetIdentificationSubtaskDetailsBo.getRemarks()));
+        return queryWrapper;
+    }
+
+    /**
+     * 查询目标识别子任务
+     *
+     * @param id 目标识别子任务主键
+     * @return 目标识别子任务
+     */
+    @Override
+    public TargetIdentificationSubtaskDetailsVo selectById(Long id) {
+            return this.getOneAs(query().where(TARGET_IDENTIFICATION_SUBTASK_DETAILS.ID.eq(id)), TargetIdentificationSubtaskDetailsVo.class);
+
+    }
+
+    /**
+     * 查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 目标识别子任务集合
+     */
+    @Override
+    public List<TargetIdentificationSubtaskDetailsVo> selectList(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationSubtaskDetailsBo);
+            return this.listAs(queryWrapper, TargetIdentificationSubtaskDetailsVo.class);
+    }
+
+    /**
+     * 分页查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 分页目标识别子任务集合
+     */
+    @Override
+    public PageResult<TargetIdentificationSubtaskDetailsVo> selectPage(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationSubtaskDetailsBo);
+            Page<TargetIdentificationSubtaskDetailsVo> page = this.pageAs(PageQuery.build(), queryWrapper, TargetIdentificationSubtaskDetailsVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增目标识别子任务
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        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值
+    }
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        TargetIdentificationSubtaskDetails targetIdentificationSubtaskDetails =MapstructUtils.convert(targetIdentificationSubtaskDetailsBo, TargetIdentificationSubtaskDetails. class);
+        if (ObjectUtil.isNotNull(targetIdentificationSubtaskDetails) && ObjectUtil.isNotNull(targetIdentificationSubtaskDetails.getId())){
+            boolean updated = this.updateById(targetIdentificationSubtaskDetails);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除目标识别子任务
+     *
+     * @param ids 需要删除的目标识别子任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 263 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java

@@ -0,0 +1,263 @@
+package com.taais.biz.service.impl;
+
+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.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;
+
+/**
+ * 目标识别子任务Service业务层处理
+ *
+ * @author Allen
+ * 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);
+    }
+
+    private QueryWrapper buildQueryWrapper(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        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
+        (targetIdentificationSubtaskBo.getRemarks()));
+        return queryWrapper;
+    }
+
+    /**
+     * 查询目标识别子任务
+     *
+     * @param id 目标识别子任务主键
+     * @return 目标识别子任务
+     */
+    @Override
+    public TargetIdentificationSubtaskVo selectById(Long id) {
+            return this.getOneAs(query().where(TARGET_IDENTIFICATION_SUBTASK.ID.eq(id)), TargetIdentificationSubtaskVo.class);
+
+    }
+
+    /**
+     * 查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 目标识别子任务集合
+     */
+    @Override
+    public List<TargetIdentificationSubtaskVo> selectList(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationSubtaskBo);
+            return this.listAs(queryWrapper, TargetIdentificationSubtaskVo.class);
+    }
+
+    /**
+     * 分页查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 分页目标识别子任务集合
+     */
+    @Override
+    public PageResult<TargetIdentificationSubtaskVo> selectPage(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationSubtaskBo);
+            Page<TargetIdentificationSubtaskVo> page = this.pageAs(PageQuery.build(), queryWrapper, TargetIdentificationSubtaskVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增目标识别子任务
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+    TargetIdentificationSubtask targetIdentificationSubtask =MapstructUtils.convert(targetIdentificationSubtaskBo, TargetIdentificationSubtask. class);
+
+        return this.save(targetIdentificationSubtask);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    @Override
+    public TargetIdentificationSubtask insertSubtask(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        TargetIdentificationSubtask targetIdentificationSubtask =MapstructUtils.convert(targetIdentificationSubtaskBo, TargetIdentificationSubtask. class);
+
+        this.save(targetIdentificationSubtask);//使用全局配置的雪花算法主键生成器生成ID值
+
+        return targetIdentificationSubtask;
+    }
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo) {
+        TargetIdentificationSubtask targetIdentificationSubtask =MapstructUtils.convert(targetIdentificationSubtaskBo, TargetIdentificationSubtask. class);
+        if (ObjectUtil.isNotNull(targetIdentificationSubtask) && ObjectUtil.isNotNull(targetIdentificationSubtask.getId())){
+            boolean updated = this.updateById(targetIdentificationSubtask);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除目标识别子任务
+     *
+     * @param ids 需要删除的目标识别子任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        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);
+            }
+        }
+    }
+}

+ 375 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java

@@ -0,0 +1,375 @@
+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.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 static com.taais.biz.domain.table.TargetIdentificationTaskTableDef.TARGET_IDENTIFICATION_TASK;
+
+/**
+ * 目标识别任务Service业务层处理
+ *
+ * @author km
+ * 2024-08-17
+ */
+@Service
+public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetIdentificationTaskMapper, TargetIdentificationTask> implements ITargetIdentificationTaskService {
+    @Resource
+    private TargetIdentificationTaskMapper targetIdentificationTaskMapper;
+
+    @Resource
+    private ITargetIdentificationSubtaskService subtaskService;
+    @Resource
+    private ITargetIdentificationSubtaskDetailsService subtaskDetailsService;
+
+    @Resource
+    private IAlgorithmTaskConfigurationService algorithmTaskConfigurationService;
+
+    @Resource
+    private DataServiceImpl dataService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(TARGET_IDENTIFICATION_TASK);
+    }
+
+    private QueryWrapper buildQueryWrapper(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(TARGET_IDENTIFICATION_TASK.NAME.like
+        (targetIdentificationTaskBo.getName()));
+        queryWrapper.and(TARGET_IDENTIFICATION_TASK.STATUS.eq
+        (targetIdentificationTaskBo.getStatus()));
+        queryWrapper.and(TARGET_IDENTIFICATION_TASK.REMARKS.eq
+        (targetIdentificationTaskBo.getRemarks()));
+        return queryWrapper;
+    }
+
+    /**
+     * 查询目标识别任务
+     *
+     * @param id 目标识别任务主键
+     * @return 目标识别任务
+     */
+    @Override
+    public TargetIdentificationTaskVo selectById(Long id) {
+            return this.getOneAs(query().where(TARGET_IDENTIFICATION_TASK.ID.eq(id)), TargetIdentificationTaskVo.class);
+
+    }
+
+    /**
+     * 查询目标识别任务列表
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 目标识别任务集合
+     */
+    @Override
+    public List<TargetIdentificationTaskVo> selectList(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationTaskBo);
+            return this.listAs(queryWrapper, TargetIdentificationTaskVo.class);
+    }
+
+    /**
+     * 分页查询目标识别任务列表
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 分页目标识别任务集合
+     */
+    @Override
+    public PageResult<TargetIdentificationTaskVo> selectPage(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationTaskBo);
+            Page<TargetIdentificationTaskVo> page = this.pageAs(PageQuery.build(), queryWrapper, TargetIdentificationTaskVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增目标识别任务
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @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 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;
+    }
+
+    /**
+     * 修改目标识别任务
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
+        if (ObjectUtil.isNotNull(targetIdentificationTask) && ObjectUtil.isNotNull(targetIdentificationTask.getId())){
+            boolean updated = this.updateById(targetIdentificationTask);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除目标识别任务
+     *
+     * @param ids 需要删除的目标识别任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        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) {
+        String errorMsg = "";
+        // 检查数据是否有问题
+        errorMsg = checkTask(taskDto);
+
+        if (StringUtils.isNotEmpty(errorMsg)){
+            return errorMsg;
+        }
+        // 创建任务
+        TargetIdentificationTaskBo taskBo = new TargetIdentificationTaskBo();
+        taskBo.setName(taskDto.getTaskName());
+        taskBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+        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)){
+            createTrainTask(taskBo.getId(),taskDto);
+        }
+        // 创建测试子任务
+        if (taskDto.getTaskItemList().contains(CreateTargetIdentificationTaskDto.TASK_TYPE_SINGLE_DATA_AND_MORE_ALGORITHM)){
+            createTestTask(taskBo.getId(),taskDto);
+        }
+        return null;
+    }
+
+    private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+        List<TaskDto> algTaskList = taskDto.getAlgTaskList();
+        List<String> trainBatchNumList = taskDto.getTrainBatchNumList();
+        if (trainBatchNumList.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 < 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);
+            }
+        }
+    }
+
+    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 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>

+ 12 - 0
taais-modules/taais-biz/src/main/resources/mapper/biz/DataMapper.xml

@@ -9,4 +9,16 @@
         FROM
             generate_series(1, #{size})
     </select>
+
+    <select id="getBatchData" resultType="com.taais.biz.domain.vo.BatchDataResult">
+        select batch_num, count(1) as batch_size
+        from public.data
+        group by batch_num
+        order by batch_num
+    </select>
+
+    <select id="getFormSelects" resultType="com.taais.biz.domain.vo.DataSelectVo">
+        select ${field} as label, ${field} as value from data GROUP BY ${field}
+    </select>
+
 </mapper>

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

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "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>

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

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "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>

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

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "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>

+ 7 - 0
taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmTaskConfigurationMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.taais.biz.mapper.AlgorithmTaskConfigurationMapper">
+
+</mapper>