فهرست منبع

feat: 解决冲突

WANGKANG 9 ماه پیش
والد
کامیت
44ef9ef39f
65فایلهای تغییر یافته به همراه4488 افزوده شده و 70 حذف شده
  1. 357 0
      script/sql/postgresql/data(postgresql).sql
  2. 1 1
      script/sql/postgresql/postgresql-V1.0.0.sql
  3. BIN
      script/sql/postgresql/taais20240815-2.sql
  4. BIN
      script/sql/postgresql/taais2024811.sql
  5. 3 6
      taais-admin/src/main/java/com/taais/web/controller/common/CommonController.java
  6. 16 2
      taais-admin/src/main/resources/application-dev.yml
  7. 3 2
      taais-admin/src/main/resources/application.yml
  8. 22 5
      taais-modules/taais-biz/src/main/java/com/taais/biz/component/ScheduledTasks.java
  9. 1 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/constant/BizConstant.java
  10. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmTaskConfigurationController.java
  11. 121 7
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java
  12. 14 1
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/PublicController.java
  13. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskController.java
  14. 154 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskDetailsController.java
  15. 133 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java
  16. 60 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmTaskConfiguration.java
  17. 46 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtask.java
  18. 82 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java
  19. 43 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationTask.java
  20. 75 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/AlgorithmTaskConfigurationBo.java
  21. 16 16
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/DataBo.java
  22. 48 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskBo.java
  23. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskDetailsBo.java
  24. 44 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationTaskBo.java
  25. 37 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/DataAmplifyDto.java
  26. 40 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTargetIdentificationTaskDto.java
  27. 64 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationImportVo.java
  28. 74 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationVo.java
  29. 30 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/BatchDataResult.java
  30. 74 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataExcelVo.java
  31. 9 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataSelectVo.java
  32. 85 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsImportVo.java
  33. 97 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsVo.java
  34. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskImportVo.java
  35. 53 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskVo.java
  36. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskImportVo.java
  37. 50 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskVo.java
  38. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/AlgorithmTaskConfigurationImportListener.java
  39. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskDetailsImportListener.java
  40. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskImportListener.java
  41. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationTaskImportListener.java
  42. 3 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmModelMapper.java
  43. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmTaskConfigurationMapper.java
  44. 7 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/DataMapper.java
  45. 22 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.java
  46. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskMapper.java
  47. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationTaskMapper.java
  48. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmTaskConfigurationService.java
  49. 28 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java
  50. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskDetailsService.java
  51. 71 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskService.java
  52. 70 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationTaskService.java
  53. 1 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmModelServiceImpl.java
  54. 138 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmTaskConfigurationServiceImpl.java
  55. 221 20
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
  56. 182 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java
  57. 248 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java
  58. 492 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java
  59. 12 7
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/VideoStableServiceImpl.java
  60. 3 0
      taais-modules/taais-biz/src/main/resources/mapper/ag/AlgorithmModelMapper.xml
  61. 12 0
      taais-modules/taais-biz/src/main/resources/mapper/biz/DataMapper.xml
  62. 16 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskDetailsMapper.xml
  63. 18 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskMapper.xml
  64. 18 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationTaskMapper.xml
  65. 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, '');

+ 1 - 1
script/sql/postgresql/postgresql-V1.0.0.sql

@@ -1989,7 +1989,7 @@ CREATE TABLE public.sys_dict_data
     create_time timestamp without time zone,
     update_by   bigint,
     update_time timestamp without time zone,
-    remark      character varying(500) DEFAULT NULL::character varying
+    remark      character varying(2000) DEFAULT NULL::character varying
 );
 
 

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


BIN
script/sql/postgresql/taais2024811.sql


+ 3 - 6
taais-admin/src/main/java/com/taais/web/controller/common/CommonController.java

@@ -26,10 +26,7 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -104,7 +101,7 @@ public class CommonController {
             // 信息保存在文件管理
             SysOssVo oss = sysOssService.saveResultEntity(file.getOriginalFilename(),suffix, url,fileName);
             SysOssUploadVo uploadVo = new SysOssUploadVo();
-            uploadVo.setUrl(oss.getUrl());
+            uploadVo.setUrl("/profile" + oss.getUrl().split("/profile")[1]);
             uploadVo.setFileName(oss.getOriginalName());
             uploadVo.setOssId(oss.getOssId().toString());
             return CommonResult.success(uploadVo);
@@ -137,7 +134,7 @@ public class CommonController {
             // 信息保存在文件管理
             SysOssVo oss = sysOssService.saveResultEntity(file.getOriginalFilename(),suffix, url,fileName);
             SysOssUploadVo uploadVo = new SysOssUploadVo();
-            uploadVo.setUrl(oss.getUrl());
+            uploadVo.setUrl("/profile" + oss.getUrl().split("/profile")[1]);
             uploadVo.setFileName(oss.getOriginalName());
             uploadVo.setOssId(oss.getOssId().toString());
             return CommonResult.success(uploadVo);

+ 16 - 2
taais-admin/src/main/resources/application-dev.yml

@@ -37,9 +37,10 @@ mybatis-flex:
       #      password: Root@369
       #postgresql数据库
       driver-class-name: org.postgresql.Driver
-      url: jdbc:postgresql://127.0.0.1:5432/taais?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
+#      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: 123456
+      password: P3x0LG8jzyHRX59l
 
 #    # 数据源-2
 #    ds2:
@@ -180,3 +181,16 @@ sa-token:
   # jwt秘钥
   jwt-secret-key: abcdefghijklmnopqrstuvwxyz
   is-print: off #关闭控制台banner
+
+
+captcha:
+  enable: true
+  # 页面 <参数设置> 可开启关闭 验证码校验
+  # 验证码类型 math 数组计算 char 字符验证
+  type: MATH
+  # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
+  category: CIRCLE
+  # 数字验证码位数
+  numberLength: 1
+  # 字符验证码长度
+  charLength: 4

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

@@ -13,6 +13,7 @@ taais:
   profile: /home/ObjectDetection_Web
   # 获取ip地址开关
   addressEnabled: false
+  video_stable_url: http://localhost:11001/video_stable
 
 captcha:
   enable: true
@@ -302,7 +303,7 @@ security:
     - /captcha/get
     - /captcha/check
 
---- # Actuator 监控端点的配置项
+# Actuator 监控端点的配置项
 management:
   endpoints:
     web:
@@ -314,7 +315,7 @@ management:
     logfile:
       external-file: ./logs/sys-console.log
 
---- # websocket
+# websocket
 websocket:
   enabled: true
   # 路径

+ 22 - 5
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,25 @@ public class ScheduledTasks {
 
     @Resource
     IAlgorithmTaskService algorithmTaskService;
-    @Scheduled(fixedRate = 10000)
-    public void runTask() {
-        log.info("ScheduledTasks.runTask start");
-        algorithmTaskService.taskRun();
-        log.info("ScheduledTasks.runTask end");
+
+    @Resource
+    TargetIdentificationTaskServiceImpl targetIdentificationTaskService;
+
+    //@Scheduled(fixedRate = 10000)
+    //public void runTask() {
+    //    log.info("ScheduledTasks.runTask start");
+    //    algorithmTaskService.taskRun();
+    //    log.info("ScheduledTasks.runTask end");
+    //}
+
+    @Scheduled(fixedRate = 30000)
+    public void taskRun() {
+        try {
+            log.info("ScheduledTasks.taskRun start");
+            targetIdentificationTaskService.taskRun();
+            log.info("ScheduledTasks.taskRun end");
+        } catch (Exception e) {
+            log.error("ScheduledTasks.taskRun error", e);
+        }
     }
 }

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

@@ -70,6 +70,6 @@ public class BizConstant {
     public static final String P_CURVE = "P_curve.png";
     public static final String F1_CURVE = "F1_curve.png";
     public static final String ORIGINAL_IMAGE= "原始图片";
-    public static final String DOCKER_BASE_PATH= "/workspace";
+    public static final String DOCKER_BASE_PATH= "/home/ObjectDetection_Web";
     public static final String DOCKER_PT_PATH= "weights/best.pt";
 }

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

+ 121 - 7
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java

@@ -1,6 +1,16 @@
 package com.taais.biz.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.taais.biz.domain.vo.BatchDataResult;
+import cn.hutool.core.util.IdUtil;
+import com.taais.biz.domain.Data;
+import com.taais.biz.domain.bo.DataBo;
+import com.taais.biz.domain.dto.DataAmplifyDto;
+import com.taais.biz.domain.vo.DataExcelVo;
+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.config.TaaisConfig;
 import com.taais.common.core.core.domain.CommonResult;
 import com.taais.common.core.core.page.PageResult;
 import com.taais.common.excel.utils.ExcelUtil;
@@ -8,14 +18,14 @@ 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.ServletOutputStream;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,8 +33,16 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 /**
  * 数据管理Controller
@@ -49,9 +67,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());
     }
 
     /**
@@ -61,8 +94,84 @@ public class DataController extends BaseController {
     @Log(title = "数据管理", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, DataBo dataBo) {
+        // 查询数据列表
         List<DataVo> list = dataService.selectList(dataBo);
-        ExcelUtil.exportExcel(list, "数据管理", DataVo.class, response);
+
+        // 创建一个临时目录用于存放文件
+        String tempDirPath = System.getProperty("java.io.tmpdir") + "/export_" + System.currentTimeMillis();
+        File tempDir = new File(tempDirPath);
+        if (!tempDir.exists()) {
+            log.info("创建临时目录:{}", tempDir.mkdirs());
+        }
+        String profile = TaaisConfig.getProfile();
+        // 拷贝文件到临时目录
+        for (DataVo dataVo : list) {
+            File srcFile = new File(profile + dataVo.getUrl());
+            File destFile = new File(tempDir, srcFile.getName());
+            try {
+                if (srcFile.exists()) {
+                    FileUtils.copyFile(srcFile, destFile);
+                } else {
+                    log.error("图片源文件不存在:{}", srcFile.getName());
+                }
+                if (!StringUtils.isEmpty(dataVo.getLabelurl())) {
+                    File labelurlFile = new File(profile + dataVo.getLabelurl());
+                    File labelurlDestFile = new File(tempDir, labelurlFile.getName());
+                    if (labelurlFile.exists()) {
+                        FileUtils.copyFile(labelurlFile, labelurlDestFile);
+                    } else {
+                        log.error("标注源文件不存在:{}", labelurlFile.getName());
+                    }
+                }
+            } catch (IOException e) {
+                throw new RuntimeException("文件拷贝失败:" + srcFile.getName(), e);
+            }
+        }
+
+        List<DataExcelVo> dataExcelVoList = new ArrayList<>();
+        if (!list.isEmpty()) {
+            dataExcelVoList = list.stream().map(info -> DataExcelVo.builder().id(info.getId()).name(info.getName())
+                            .dataType(info.getDataType()).fileType(info.getFileType()).objectType(info.getObjectType())
+                            .objectSubtype(info.getObjectSubtype()).batchNum(info.getBatchNum()).scene(info.getScene())
+                            .dataSource(info.getDataSource()).gatherTime(info.getGatherTime()).gatherSpot(info.getGatherSpot())
+                            .increment(info.getIncrement()).build())
+                    .toList();
+        }
+        // 生成 Excel 文件并保存到临时目录
+        File excelFile = new File(tempDir, "数据管理.xlsx");
+        try (FileOutputStream fos = new FileOutputStream(excelFile)) {
+            ExcelUtil.exportExcel(dataExcelVoList, "数据管理", DataExcelVo.class, fos);
+        } catch (IOException e) {
+            throw new RuntimeException("生成Excel文件失败", e);
+        }
+        // 将临时目录打包为ZIP文件
+        File zipFile = new File(tempDir.getParent(), "export_" + System.currentTimeMillis() + ".zip");
+        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {
+            for (File file : Objects.requireNonNull(tempDir.listFiles())) {
+                zos.putNextEntry(new ZipEntry(file.getName()));
+                try (FileInputStream fis = new FileInputStream(file)) {
+                    IOUtils.copy(fis, zos);
+                }
+                zos.closeEntry();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("打包ZIP文件失败", e);
+        }
+
+        // 设置响应头,返回ZIP文件给客户端
+        response.setContentType("application/zip");
+        response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getName());
+
+        try (ServletOutputStream os = response.getOutputStream()) {
+            FileUtils.copyFile(zipFile, os);
+            os.flush();
+        } catch (IOException e) {
+            throw new RuntimeException("返回ZIP文件失败", e);
+        } finally {
+            // 删除临时文件
+            FileUtils.deleteQuietly(tempDir);
+            FileUtils.deleteQuietly(zipFile);
+        }
     }
 
     /**
@@ -129,6 +238,11 @@ public class DataController extends BaseController {
         if (file == null) {
             return CommonResult.fail("请上传.zip、.rar压缩文件。");
         }
-        return dataService.uploadDataInfo(file,dataInfo);
+        return dataService.uploadDataInfo(file, dataInfo);
+    }
+
+    @PostMapping("/amplify")
+    public CommonResult<Boolean> dataAmplify(@RequestBody DataAmplifyDto dataAmplifyDto) {
+        return dataService.dataAmplify(dataAmplifyDto);
     }
 }

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

@@ -1,12 +1,14 @@
 package com.taais.biz.controller;
 
 import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
 import com.taais.biz.domain.bo.VideoStableStartResultBo;
 import com.taais.biz.domain.dto.TaskResultDTO;
 import com.taais.biz.service.IAlgorithmBizProcessService;
 import com.taais.biz.service.IAlgorithmDataProcessService;
 import com.taais.biz.service.IAlgorithmTaskService;
 import com.taais.biz.service.IVideoStableService;
+import com.taais.biz.service.impl.TargetIdentificationSubtaskDetailsServiceImpl;
 import com.taais.common.core.core.domain.CommonResult;
 import com.taais.common.log.annotation.Log;
 import com.taais.common.log.enums.BusinessType;
@@ -38,8 +40,15 @@ public class PublicController extends BaseController {
     @Resource
     IAlgorithmBizProcessService bizProcessService;
 
+    @Resource
+    TargetIdentificationSubtaskDetailsServiceImpl detailsService;
+
     @Resource
     private IAlgorithmTaskService algorithmTaskService;
+
+
+
+    // todo: 2024080906
     @PostMapping("/taskResult")
     public CommonResult<Void> taskResult(@RequestBody TaskResultDTO resultDTO) {
         log.info("taskResult start,params:{}",resultDTO);
@@ -50,7 +59,11 @@ public class PublicController extends BaseController {
         }
         String bizType = resultDTO.getBizType();
         if(BizConstant.TYPE_DATA_BIZ_PROCESS.equals(bizType)){
-            errorMsg = bizProcessService.taskResult(resultDTO);
+            //errorMsg = bizProcessService.taskResult(resultDTO);
+            TargetIdentificationSubtaskDetailsBo detailsBo = detailsService.getById(resultDTO.getBizId());
+            detailsBo.setStatus(resultDTO.getStatus() != 200 ? BizConstant.TASK_STATUS_FAILED :
+                resultDTO.getMsg().contains("finish") ? BizConstant.TASK_STATUS_SUCCEED : BizConstant.TASK_STATUS_PROCESSING);
+            detailsService.update(detailsBo);
         } else if (BizConstant.TYPE_DATA_PROCESS.equals(bizType)) {
             errorMsg = dataProcessService.taskResult(resultDTO);
         } else {

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

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

@@ -0,0 +1,154 @@
+package com.taais.biz.controller;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
+import com.taais.biz.service.impl.TargetIdentificationSubtaskServiceImpl;
+import com.taais.common.core.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.beans.factory.annotation.Value;
+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;
+
+    @Resource
+    private TargetIdentificationSubtaskServiceImpl subtaskService;
+
+    /**
+     * 查询目标识别子任务列表
+     */
+    @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();
+    }
+
+    @PostMapping("/execute")
+    public CommonResult<Void> add(@RequestBody Map<String, String> params) {
+        try {
+            Long taskId = Long.parseLong(params.get("taskId"));
+            TargetIdentificationSubtaskDetails details = targetIdentificationSubtaskDetailsService.getById(taskId);
+            details.setStatus(BizConstant.TASK_STATUS_PENDING);
+            targetIdentificationSubtaskDetailsService.updateById(details);
+
+            subtaskService.executeOneTask(taskId);
+            return CommonResult.success();
+        } catch (Exception e) {
+            return CommonResult.fail(e.getMessage());
+        }
+    }
+
+    @Value("${taais.profile}")
+    private String profile;
+
+    @GetMapping("/getImgList")
+    public CommonResult<List<String>> getImgList(String taskId, String subPath) {
+        String path = profile + "/task/" + taskId;
+        if (StringUtils.isNotEmpty(subPath)) {
+            path += "/" + subPath;
+        }
+        System.out.println("path is : " + path);
+        File file = new File( path );
+        File[] files = file.listFiles();
+        List<String> res = new ArrayList<>();
+        for (File _file: files) {
+            res.add(_file.getName());
+        }
+        return CommonResult.success(res);
+    }
+}

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

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

@@ -0,0 +1,82 @@
+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;
+
+}

+ 37 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/DataAmplifyDto.java

@@ -0,0 +1,37 @@
+package com.taais.biz.domain.dto;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.util.Map;
+
+
+/**
+ * @author Eureka
+ */
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class DataAmplifyDto {
+
+    @NotEmpty(message = "批次不能为空")
+    private String batchNum;
+
+    @NotEmpty(message = "任务名称")
+    private String taskName;
+
+    @NotEmpty(message = "扩充方式不能为空")
+    private String augmentationType;
+
+    private String inputImagePath;
+
+    private String outputImagePath;
+
+    @NotNull(message = "扩充算法配置不能为空")
+    private Map<String, String> otherParams;
+}

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

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

@@ -0,0 +1,74 @@
+package com.taais.biz.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.taais.biz.domain.Data;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author king
+ * @date 2024年08月23日 上午9:43
+ */
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+@ExcelIgnoreUnannotated
+@AutoMapper(target = Data.class)
+public class DataExcelVo {
+
+    @ExcelProperty(value = "编号")
+    private Long id;
+
+    /** 名称 */
+    @ExcelProperty(value = "名称")
+    private String name;
+
+    /** 数据类型 */
+    @ExcelProperty(value = "数据类型")
+    private String dataType;
+
+    /** 文件类型 */
+    @ExcelProperty(value = "文件类型")
+    private String fileType;
+
+    /** 目标类型 */
+    @ExcelProperty(value = "目标类型")
+    private String objectType;
+
+    /** 目标子类型 */
+    @ExcelProperty(value = "目标子类型")
+    private String objectSubtype;
+
+    /** 批次号 */
+    @ExcelProperty(value = "批次号")
+    private String batchNum;
+
+    /** 场景 */
+    @ExcelProperty(value = "场景")
+    private String scene;
+
+    /** 数据源 */
+    @ExcelProperty(value = "数据源")
+    private String dataSource;
+
+    /** 采集时间 */
+    @ExcelProperty(value = "采集时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date gatherTime;
+
+    /** 采集地点 */
+    @ExcelProperty(value = "采集地点")
+    private String gatherSpot;
+
+    /** 扩增方式 */
+    @ExcelProperty(value = "扩增方式")
+    private String increment;
+}

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

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

@@ -0,0 +1,97 @@
+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;
+
+    private String type;
+
+    /** 数据批次号 */
+    @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);
 }

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

@@ -0,0 +1,22 @@
+package com.taais.biz.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+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);
+
+    List<Long> getByTaskType(String taskType);
+}

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

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

@@ -1,8 +1,13 @@
 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.dto.DataAmplifyDto;
+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 +22,13 @@ import org.springframework.web.multipart.MultipartFile;
  * 2024-06-14
  */
 public interface IDataService extends IBaseService<Data> {
+    /**
+     * 查询批次情况
+     *
+     * @return 数据批次信息
+     */
+    List<BatchDataResult> batchSelect();
+
     /**
      * 查询数据管理
      *
@@ -42,6 +54,14 @@ public interface IDataService extends IBaseService<Data> {
      */
     CommonResult<Boolean> uploadDataInfo(MultipartFile file, Data dataInfo);
 
+    /**
+     * 数据扩增
+     *
+     * @param dataAmplifyDto 数据表单
+     * @return 数据管理集合
+     */
+    CommonResult<Boolean> dataAmplify(DataAmplifyDto dataAmplifyDto);
+
     /**
      * 分页查询数据管理列表
      *
@@ -75,4 +95,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));
+    }
+
+}

+ 221 - 20
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java

@@ -1,10 +1,18 @@
 package com.taais.biz.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 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.dto.DataAmplifyDto;
+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;
@@ -16,14 +24,18 @@ import com.taais.common.core.utils.StringUtils;
 import com.taais.common.core.utils.file.FileUploadUtils;
 import com.taais.common.core.utils.file.FileUtils;
 import com.taais.common.core.utils.file.UnPackedUtil;
+import com.taais.common.json.utils.JsonUtils;
 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;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
@@ -33,8 +45,11 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.time.Instant;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import static com.taais.biz.domain.table.DataTableDef.DATA;
 
@@ -46,11 +61,17 @@ 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";
     private static final String TXT = ".txt";
     private static final String[] VALID_EXTENSIONS = {".jpg", ".jpeg", ".png"};
+    private static final String PYTHON_DATA_AMPLIFY_API = "http://127.0.0.1:9096/api/data/amplify";
+    private static final String RESULT_CODE = "status";
+    private static final String RESULT_STATUS = "200";
+    private static final String AMPLIFY = "/AMPLIFY/";
     @Resource
     private DataMapper dataMapper;
 
@@ -62,37 +83,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 +128,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 +216,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);
                     //设置文件创建时间
@@ -239,6 +268,63 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
         return CommonResult.success("数据集上传成功!");
     }
 
+    @Override
+    @Transactional
+    public CommonResult<Boolean> dataAmplify(DataAmplifyDto dataAmplifyDto) {
+        //根据批次号获取该批次的所有文件数据
+        QueryWrapper query = query();
+        query.eq(Data::getBatchNum, dataAmplifyDto.getBatchNum());
+        List<Data> dataList = dataMapper.selectListByQuery(query);
+        if (dataList.isEmpty()) {
+            return CommonResult.fail("该批次下没有文件数据,请重新选择批次!");
+        }
+        //TODO: 此处需要定义任务开始,把相关任务信息添加上(任务名称、任务开始时间、任务类型),然后再处理文件。
+
+        List<Data> dataListInfo = dataList.stream().filter(data -> !StringUtils.isEmpty(data.getUrl())).toList();
+        if (dataListInfo.isEmpty()) {
+            return CommonResult.fail("该批次下没有文件数据,请重新选择批次!");
+        }
+        String filePath = TaaisConfig.getUploadPath();
+        LocalDate currentDate = LocalDate.now();
+        // 定义日期格式器
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+        String formattedDate = currentDate.format(formatter);
+        filePath = filePath + File.separator + formattedDate;
+        String finalFilePath = filePath;
+        dataListInfo.forEach(dataInfo -> {
+            try {
+                //循环调用Python扩增接口
+                Map<String, Object> bodyJson = new HashMap<>();
+                bodyJson.put("augmentationType", dataAmplifyDto.getAugmentationType());
+                bodyJson.put("inputImagePath", dataInfo.getUrl());
+                String outputImagePath = finalFilePath + AMPLIFY + System.currentTimeMillis();
+                File desc = new File(outputImagePath);
+                if (!desc.exists()) {
+                    log.info("创建文件目录: {}", desc.mkdirs());
+                }
+                bodyJson.put("outputImagePath", outputImagePath);
+                bodyJson.put("otherParams", dataAmplifyDto.getOtherParams());
+                //实际请求接口,接口未提供,暂且注释
+//                String response = HttpRequest.post(PYTHON_DATA_AMPLIFY_API)
+//                        .body(JsonUtils.toJsonString(bodyJson))
+//                        .execute().body();
+                String response = "{\"status\":200,\"msg\":\"扩增成功\"}";
+                ObjectMapper objectMapper = new ObjectMapper();
+                JsonNode rootNode = objectMapper.readTree(response);
+                String resultCode = rootNode.path(RESULT_CODE).asText();
+                //判断接口是否响应成功
+                if (!RESULT_STATUS.equals(resultCode)) {
+                    throw new RuntimeException("调用Python接口返回扩增失败");
+                }
+                //处理当前目录文件,并进行入库
+                saveDataInfo(outputImagePath, dataInfo);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return CommonResult.fail("该批次下没有文件数据,请重新选择批次!");
+    }
+
     private void initFileInfo(String dest, List<File> extractedImagesFileList, boolean directory, String fileName) {
         if (!directory) {
             String fileHeaderSuffix = StringUtils.substring(fileName, fileName.lastIndexOf("."), fileName.length());
@@ -278,10 +364,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 +395,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 +414,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 +424,97 @@ 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;
+    }
+
+
+    /**
+     * 解析目标目录所有文件,进行文件更名并入库
+     *
+     * @param directoryPath:目录地址
+     * @param dataInfo:深拷贝对象
+     */
+    public void saveDataInfo(String directoryPath, Data dataInfo) {
+        try {
+            // 获取指定目录下所有文件
+            File directory = new File(directoryPath);
+            List<File> extractedImagesFileList = new ArrayList<>();
+            if (directory.exists() && directory.isDirectory()) {
+                File[] files = directory.listFiles();
+                if (files != null) {
+                    for (File file : files) {
+                        initFileInfo(directoryPath, extractedImagesFileList, file.isDirectory(), file.getName());
+                    }
+                }
+            }
+
+            // 获取ID集合
+            List<Long> ids = dataMapper.getIds(extractedImagesFileList.size());
+            if (ids.isEmpty()) {
+                return;
+            }
+
+            List<Data> dataList = new ArrayList<>();
+            AtomicInteger countSize = new AtomicInteger();
+            extractedImagesFileList.forEach(fileInfo -> {
+                Long id = ids.get(countSize.get());
+                Data data = new Data();
+                BeanUtils.copyProperties(dataInfo, data);
+
+                if (checkLabeled(fileInfo.getPath())) {
+                    data.setLabeled(Boolean.TRUE);
+                } else {
+                    data.setLabeled(Boolean.FALSE);
+                }
+
+                try {
+                    Path path = Paths.get(fileInfo.getAbsolutePath());
+                    BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
+                    Instant creationTime = attrs.lastModifiedTime().toInstant();
+                    Date date = Date.from(creationTime);
+
+                    data.setId(id);
+                    data.setGatherTime(date);
+                    data.setName(fileInfo.getName());
+
+                    // 更改图片文件名称
+                    String fileHeaderSuffix = StringUtils.substring(fileInfo.getName(), fileInfo.getName().lastIndexOf("."), fileInfo.getName().length());
+                    String destInfo = fileInfo.getPath().replaceAll(fileInfo.getName(), "");
+                    File newFile = new File(destInfo, id + fileHeaderSuffix);
+                    File oldFile = new File(destInfo, fileInfo.getName());
+                    log.info("saveDataInfo更改用户上传图片文件名称:{}", oldFile.renameTo(newFile));
+
+                    String imagePath = FileUploadUtils.getPathFileName(destInfo, id + fileHeaderSuffix);
+                    data.setUrl(imagePath);
+
+                    if (data.getLabeled()) {
+                        String labeledPath = fileInfo.getPath().replaceFirst("[.][^.]+$", "") + ".txt";
+                        File labeledNewFile = new File(destInfo, id + ".txt");
+                        File labeledOldFile = new File(labeledPath);
+                        log.info("saveDataInfo更改用户上传标注文件名称:{}", labeledOldFile.renameTo(labeledNewFile));
+                        String labelUrl = FileUploadUtils.getPathFileName(destInfo, id + ".txt");
+                        data.setLabelurl(labelUrl);
+                    }
+                    dataList.add(data);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+                countSize.getAndIncrement();
+            });
+
+            dataMapper.insertBatch(dataList);
+        } catch (Exception e) {
+            log.error("[saveDataInfo]数据集处理出现未知异常.e:", e);
+        }
+    }
+
 }

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

@@ -0,0 +1,182 @@
+package com.taais.biz.service.impl;
+
+import java.util.ArrayList;
+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);
+
+    }
+
+    public TargetIdentificationSubtaskDetailsBo getById(Long id) {
+        return this.getOneAs(query().where(TARGET_IDENTIFICATION_SUBTASK_DETAILS.ID.eq(id)), TargetIdentificationSubtaskDetailsBo.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());
+        targetIdentificationSubtaskDetails.setIndex(targetIdentificationSubtaskDetailsBo.getIndex());
+        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);
+        System.out.println("convert subdetail: " + targetIdentificationSubtaskDetails);
+        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));
+    }
+
+    public Long getAvailableTask() {
+        List<Long> list = null;
+        list = targetIdentificationSubtaskDetailsMapper.getByTaskType("训练");
+        if (!list.isEmpty()) {
+            return list.get(0);
+        }
+        list = targetIdentificationSubtaskDetailsMapper.getByTaskType("验证");
+        if (!list.isEmpty()) {
+            return list.get(0);
+        }
+        list = targetIdentificationSubtaskDetailsMapper.getByTaskType("测试");
+        if (!list.isEmpty()) {
+            return list.get(0);
+        }
+        return null;
+    }
+}

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

@@ -0,0 +1,248 @@
+package com.taais.biz.service.impl;
+
+import java.lang.reflect.Type;
+import java.util.*;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson2.JSONArray;
+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.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
+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.log.annotation.Log;
+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);
+    }
+
+    public void executeOneTask(Long taskId) {
+        TargetIdentificationSubtaskDetailsBo details = detailsService.getById(taskId);
+
+        log.info("details: {}", details);
+        doProcessSubTaskDetail(details);
+    }
+
+    private void doProcess(TargetIdentificationSubtask subtask) {
+        List<TargetIdentificationSubtaskDetailsBo> detailsList = detailsService.getTargetIdentificationSubtaskDetailsListBySubtaskId(subtask.getId());
+
+        for (TargetIdentificationSubtaskDetailsBo detail : detailsList) {
+            doProcessSubTaskDetail(detail);
+        }
+    }
+
+
+    /**
+     * 执行子任务详情
+     * @param detail
+     */
+    private void doProcessSubTaskDetail(TargetIdentificationSubtaskDetailsBo detail) {
+        final String MINI_PREFIX = "/task";
+        Long algorithmId = null;
+        Long modelId = null;
+        String parameters = null;
+        String preprocessPath = null;
+        String resultPath = null;
+        String url = null;
+
+        url = detail.getType();
+        parameters = detail.getParameters();
+        preprocessPath = detail.getPreprocessPath();
+        resultPath = detail.getResultPath();
+        AlgorithmRequestDto algorithmRequestDto = new AlgorithmRequestDto();
+        algorithmRequestDto.setBizType(BizConstant.TYPE_DATA_BIZ_PROCESS);
+        algorithmRequestDto.setBizId(detail.getId());
+        algorithmRequestDto.setSourcePath(BizConstant.DOCKER_BASE_PATH + MINI_PREFIX + preprocessPath);
+        algorithmRequestDto.setResultPath(BizConstant.DOCKER_BASE_PATH + MINI_PREFIX + resultPath);
+        algorithmRequestDto.setLogPath(BizConstant.DOCKER_BASE_PATH + MINI_PREFIX + resultPath + "/log/log.log");
+        algorithmRequestDto.setOtherParams(new HashMap<>());
+
+        String taskName = detail.getName();
+        if (taskName.contains("训练")) {
+            log.info("train");
+        } else if (taskName.contains("验证")) {
+            String[] urls = url.split(";;;");
+            url = urls[0];
+            algorithmRequestDto.getOtherParams().put("weight_path", BizConstant.DOCKER_BASE_PATH + MINI_PREFIX + urls[1] + "/result/weights/best.pt");
+        } else if (taskName.contains("测试")) {
+            String[] urls = url.split(";;;");
+            url = urls[0];
+            algorithmRequestDto.getOtherParams().put("weight_path", BizConstant.DOCKER_BASE_PATH + MINI_PREFIX + urls[1] + "/result/weights/best.pt");
+        } else {
+            log.error("taskName error: " + taskName);
+            return;
+        }
+        // send http
+        System.out.println("todo: " + algorithmRequestDto.toString());
+
+        String res = HttpUtil.post(url, JSONUtil.toJsonStr(algorithmRequestDto));
+        log.info("res is: {}", res);
+        if (res != null) {
+            log.info("version is : {}", detail.getVersion());
+            try {
+                detail.setStatus(BizConstant.TASK_STATUS_SUCCEED);
+            } catch (Exception e) {
+                log.error("http request error: {}", e.getMessage());
+                detail.setStatus(BizConstant.TASK_STATUS_FAILED);
+            } finally {
+                detail.setRemarks("REMARKS");
+            }
+            detailsService.update(detail);
+        }
+    }
+}

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

@@ -0,0 +1,492 @@
+package com.taais.biz.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+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 javax.security.auth.Subject;
+
+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 TargetIdentificationSubtaskServiceImpl subtaskService;
+    @Resource
+    private TargetIdentificationSubtaskDetailsServiceImpl 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() {
+        Long id = subtaskDetailsService.getAvailableTask();
+        if (id != null) {
+            subtaskService.executeOneTask(id);
+        }
+        //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);
+
+        Map<String, String> records = null;
+        // 创建训练子任务
+        if(taskDto.getTaskItemList().contains("1")){
+            records = createTrainTask(taskBo.getId(),taskDto);
+        }
+        // 创建测试子任务
+        if (taskDto.getTaskItemList().contains("2")){
+            createTestTask(taskBo.getId(),taskDto, records);
+        }
+        return null;
+    }
+
+    private Map<String, String> createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+        List<TaskDto> algTaskList = taskDto.getAlgTaskList();
+        List<String> trainBatchNumList = taskDto.getTrainBatchNumList();
+        if (trainBatchNumList.isEmpty()) {
+            return null;
+        }
+        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);
+
+        Map<String, String> records = new HashMap<>();
+
+        for (TaskDto algTask : algTaskList) {
+            // 通过算法id 获取算法配置
+            Long algorithmId = algTask.getAlgorithmId();
+            AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
+
+            String algUrl = algorithmModelVo.getTrainUrl();
+            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));
+                String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                records.put(algName, subtaskPath);
+                subtaskDetail.setPreprocessPath(subtaskPath);
+                subtaskDetail.setResultPath(subtaskPath + "/result");
+                subtaskDetail.setIndex((long) i);
+                copyFilesToPath(batchNum, subtaskPath);
+
+                subtaskDetailsService.insert(subtaskDetail);
+            }
+        }
+        return records;
+    }
+
+    public static final String PATH_PREFIX = "/home/ObjectDetection_Web/task";
+    public static final String WORK_DIR = "/home/ObjectDetection_Web";
+    /**
+     * 移动文件到对应文件夹
+     * @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 = WORK_DIR + 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 = WORK_DIR + 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;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 移动文件到对应文件夹
+     * @param batch
+     * @param path
+     */
+    private void copyFilesToPath(String batch, String path, boolean moveLabelFile) {
+        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();
+        }
+
+        for (String batchNum : batches) {
+            List<DataVo> dataVoList = dataService.getDataByBatchNum(batchNum);
+            for (DataVo dataVo : dataVoList) {
+                String[] strings = null;
+                String relativePath = null;
+                File file = null;
+
+                if (dataVo.getLabelurl() != null) {
+                    strings = dataVo.getLabelurl().split("/profile");
+                    relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                    file = new File(relativePath);
+                    if (file.exists()) {
+                        if (!moveLabelFile) {
+                            continue;
+                        }
+                        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;
+                        }
+                    }
+                } else if (moveLabelFile) {
+                    continue;
+                }
+
+                strings = dataVo.getUrl().split("/profile");
+                relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                file = new File(relativePath);
+                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;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 检查是否有验证集
+     * @param batch
+     */
+    private boolean hasValidationSet(String batch) {
+        String[] batches = batch.split(",");
+
+        for (String batchNum : batches) {
+            List<DataVo> dataVoList = dataService.getDataByBatchNum(batchNum);
+            for (DataVo dataVo : dataVoList) {
+                String[] strings = null;
+
+                if (StringUtils.isNotEmpty(dataVo.getLabelurl())) {
+                    strings = dataVo.getLabelurl().split("/profile");
+                    String relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                    File file = new File(relativePath);
+                    if (file.exists()) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private void createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto, Map<String, String> records) {
+        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));
+                String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                subtaskDetail.setPreprocessPath(subtaskPath);
+                subtaskDetail.setResultPath(subtaskPath + "/result");
+                subtaskDetail.setIndex((long) i);
+
+                if (hasValidationSet(batchNum)) {
+                    subtaskDetail.setName(algName + "_验证");
+                    copyFilesToPath(batchNum, subtaskPath, true);
+                    subtaskDetail.setType(algorithmModelVo.getVerifyUrl() + ";;;" + records.get(algName));
+                    subtaskDetailsService.insert(subtaskDetail);
+                    subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                    subtaskDetail.setPreprocessPath(subtaskPath);
+                    subtaskDetail.setResultPath(subtaskPath + "/result");
+                }
+
+                subtaskDetail.setName(algName + "_测试");
+                subtaskDetail.setPreprocessPath(subtaskDetail.getPreprocessPath() + "/images");
+                subtaskDetail.setType(algorithmModelVo.getTestUrl() + ";;;" + records.get(algName));
+                copyFilesToPath(batchNum, subtaskPath, false);
+                subtaskDetailsService.insert(subtaskDetail);
+            }
+        }
+    }
+
+
+    // todo 检查数据是否有问题
+    private String checkTask(CreateTargetIdentificationTaskDto taskDto) {
+        return null;
+    }
+
+}

+ 12 - 7
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/VideoStableServiceImpl.java

@@ -227,15 +227,16 @@ public class VideoStableServiceImpl extends BaseServiceImpl<VideoStableMapper, V
 
         videoStable.setStartTime(new Date());
 
+        videoStable.setStatus(BizConstant.VideoStatus.RUNNING);
+        updateById(videoStable);
+
         boolean flag = sendMsg(videoStable);
-        if (flag) {
-            videoStable.setStatus(BizConstant.VideoStatus.RUNNING);
-        } else {
-            videoStable.setEndTime(new Date());
+        if (!flag) {
             videoStable.setStatus(BizConstant.VideoStatus.FAILED);
+            updateById(videoStable);
+            return CommonResult.fail("start video_stable failed");
         }
 
-        updateById(videoStable);
         return CommonResult.success("start video_stable success");
     }
 
@@ -270,7 +271,11 @@ public class VideoStableServiceImpl extends BaseServiceImpl<VideoStableMapper, V
         videoStable.setLog(msg);
         videoStable.setStatus("200".equals(status) ? BizConstant.VideoStatus.END : BizConstant.VideoStatus.FAILED);
         videoStable.setEndTime(new Date());
-        videoStable.setCostSecond((videoStable.getEndTime().getTime() - videoStable.getStartTime().getTime()) / 1000);
+        try {
+            videoStable.setCostSecond((videoStable.getEndTime().getTime() - videoStable.getStartTime().getTime()) / 1000);
+        }catch(Exception e) {
+            videoStable.setCostSecond(null);
+        }
         updateById(videoStable);
         return CommonResult.success();
     }
@@ -309,7 +314,7 @@ public class VideoStableServiceImpl extends BaseServiceImpl<VideoStableMapper, V
         return map;
     }
 
-        /**
+    /**
      * 递归统计文件夹中的文件数量
      *
      * @param directory 文件夹对象

+ 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>

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

@@ -0,0 +1,16 @@
+<?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>
+    <select id="getByTaskType" resultType="java.lang.Long">
+        select id from target_identification_subtask_details
+                  where name like '%' || #{taskType} || '%' and
+                                                        status = '0'
+    </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>