Pārlūkot izejas kodu

Merge branch 'develop' into dev-lzy

# Conflicts:
#	taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java
#	taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java
#	taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
allen 11 mēneši atpakaļ
vecāks
revīzija
6cd9fba4a6
78 mainītis faili ar 5259 papildinājumiem un 33 dzēšanām
  1. 1 0
      .gitignore
  2. 358 1
      script/sql/postgresql/data(postgresql).sql
  3. BIN
      script/sql/postgresql/taais20240815-2.sql
  4. BIN
      script/sql/postgresql/taais20240815.sql
  5. BIN
      script/sql/postgresql/taais2024811.sql
  6. 71 0
      script/sql/postgresql/video2image.sql
  7. 19 0
      script/sql/postgresql/video2imageMenu(postgresql).sql
  8. 33 0
      taais-admin/src/main/java/com/taais/web/controller/common/CommonController.java
  9. 3 21
      taais-admin/src/main/resources/application-dev.yml
  10. 1 1
      taais-admin/src/main/resources/application-prod.yml
  11. 56 0
      taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/FileUploadUtils.java
  12. 2 2
      taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/MimeTypeUtils.java
  13. 10 4
      taais-modules/taais-biz/pom.xml
  14. 13 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/component/ScheduledTasks.java
  15. 7 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/constant/BizConstant.java
  16. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/AlgorithmTaskConfigurationController.java
  17. 6 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java
  18. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskController.java
  19. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskDetailsController.java
  20. 133 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java
  21. 209 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/Video2imageController.java
  22. 60 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/AlgorithmTaskConfiguration.java
  23. 2 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/Data.java
  24. 46 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtask.java
  25. 80 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java
  26. 43 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationTask.java
  27. 99 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/Video2image.java
  28. 75 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/AlgorithmTaskConfigurationBo.java
  29. 48 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskBo.java
  30. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskDetailsBo.java
  31. 44 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationTaskBo.java
  32. 102 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/Video2imageBo.java
  33. 40 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTargetIdentificationTaskDto.java
  34. 64 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationImportVo.java
  35. 74 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/AlgorithmTaskConfigurationVo.java
  36. 30 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/BatchDataResult.java
  37. 85 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsImportVo.java
  38. 95 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsVo.java
  39. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskImportVo.java
  40. 53 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskVo.java
  41. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskImportVo.java
  42. 50 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskVo.java
  43. 95 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/Video2imageImportVo.java
  44. 103 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/Video2imageVo.java
  45. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/AlgorithmTaskConfigurationImportListener.java
  46. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskDetailsImportListener.java
  47. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskImportListener.java
  48. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationTaskImportListener.java
  49. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/Video2imageImportListener.java
  50. 3 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmModelMapper.java
  51. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/AlgorithmTaskConfigurationMapper.java
  52. 3 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/DataMapper.java
  53. 21 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.java
  54. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskMapper.java
  55. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationTaskMapper.java
  56. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/Video2imageMapper.java
  57. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IAlgorithmTaskConfigurationService.java
  58. 8 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java
  59. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskDetailsService.java
  60. 71 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskService.java
  61. 70 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationTaskService.java
  62. 71 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IVideo2imageService.java
  63. 1 2
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmModelServiceImpl.java
  64. 138 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/AlgorithmTaskConfigurationServiceImpl.java
  65. 9 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
  66. 159 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java
  67. 263 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java
  68. 375 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java
  69. 247 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/Video2imageServiceImpl.java
  70. 174 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/utils/VideoCapture.java
  71. 53 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/utils/ZipUtils.java
  72. 3 0
      taais-modules/taais-biz/src/main/resources/mapper/ag/AlgorithmModelMapper.xml
  73. 8 0
      taais-modules/taais-biz/src/main/resources/mapper/biz/DataMapper.xml
  74. 7 0
      taais-modules/taais-biz/src/main/resources/mapper/demo/Video2imageMapper.xml
  75. 11 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskDetailsMapper.xml
  76. 18 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskMapper.xml
  77. 18 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationTaskMapper.xml
  78. 7 0
      taais-modules/taais-biz/src/main/resources/mapper/task/AlgorithmTaskConfigurationMapper.xml

+ 1 - 0
.gitignore

@@ -70,3 +70,4 @@ selenium-debug.log
 
 package-lock.json
 yarn.lock
+./uploads/*

+ 358 - 1
script/sql/postgresql/data(postgresql).sql

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

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


BIN
script/sql/postgresql/taais20240815.sql


BIN
script/sql/postgresql/taais2024811.sql


+ 71 - 0
script/sql/postgresql/video2image.sql

@@ -0,0 +1,71 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : PostgreSql本地
+ Source Server Type    : PostgreSQL
+ Source Server Version : 160004
+ Source Host           : localhost:5432
+ Source Catalog        : taais
+ Source Schema         : public
+
+ Target Server Type    : PostgreSQL
+ Target Server Version : 160004
+ File Encoding         : 65001
+
+ Date: 30/08/2024 13:24:53
+*/
+
+
+-- ----------------------------
+-- Table structure for video2image
+-- ----------------------------
+DROP TABLE IF EXISTS "public"."video2image";
+CREATE TABLE "public"."video2image" (
+  "id" "pg_catalog"."int8" NOT NULL DEFAULT nextval('demo_video2image_id_seq'::regclass),
+  "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+  "status" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+  "out_path" "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",
+  "del_flag" "pg_catalog"."int2" NOT NULL DEFAULT '0'::smallint,
+  "path" "pg_catalog"."text" COLLATE "pg_catalog"."default" NOT NULL,
+  "fps" "pg_catalog"."int8" NOT NULL DEFAULT 1,
+  "tenant_id" "pg_catalog"."int8",
+  "version" "pg_catalog"."int4",
+  "zip_file_path" "pg_catalog"."text" COLLATE "pg_catalog"."default",
+  "url" "pg_catalog"."varchar" COLLATE "pg_catalog"."default"
+)
+;
+COMMENT ON COLUMN "public"."video2image"."id" IS '主键ID';
+COMMENT ON COLUMN "public"."video2image"."name" IS '视频名称';
+COMMENT ON COLUMN "public"."video2image"."status" IS '任务状态 0未开始 1进行中 2已结束';
+COMMENT ON COLUMN "public"."video2image"."out_path" IS '切割好的图片的保存路径';
+COMMENT ON COLUMN "public"."video2image"."start_time" IS '开始时间';
+COMMENT ON COLUMN "public"."video2image"."end_time" IS '结束时间';
+COMMENT ON COLUMN "public"."video2image"."cost_second" IS '耗时';
+COMMENT ON COLUMN "public"."video2image"."log" IS '日志';
+COMMENT ON COLUMN "public"."video2image"."create_by" IS '创建人';
+COMMENT ON COLUMN "public"."video2image"."create_time" IS '创建时间';
+COMMENT ON COLUMN "public"."video2image"."update_by" IS '更新人';
+COMMENT ON COLUMN "public"."video2image"."update_time" IS '更新时间';
+COMMENT ON COLUMN "public"."video2image"."remarks" IS '备注';
+COMMENT ON COLUMN "public"."video2image"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+COMMENT ON COLUMN "public"."video2image"."path" IS '视频本身保存路径 / url';
+COMMENT ON COLUMN "public"."video2image"."fps" IS '切割帧率,默认1';
+COMMENT ON COLUMN "public"."video2image"."tenant_id" IS '租户编码';
+COMMENT ON COLUMN "public"."video2image"."version" IS '乐观锁';
+COMMENT ON COLUMN "public"."video2image"."zip_file_path" IS '生成的zip文件位置';
+COMMENT ON COLUMN "public"."video2image"."url" IS '获取视频文件的url';
+COMMENT ON TABLE "public"."video2image" IS '视频转图片表';
+
+-- ----------------------------
+-- Primary Key structure for table video2image
+-- ----------------------------
+ALTER TABLE "public"."video2image" ADD CONSTRAINT "video2image_pkey" PRIMARY KEY ("id");

+ 19 - 0
script/sql/postgresql/video2imageMenu(postgresql).sql

@@ -0,0 +1,19 @@
+-- 菜单 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(2024081614402000, '视频转图片', 3, '1', 'video2image', 'demo/video2image/index', 1, 0, 'C', '0', '0', 'demo:video2image: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(2024081614402001, '视频转图片查询', 2024081614402000, '1',  '', '', 1, 0, 'F', '0', '0', 'demo:video2image: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(2024081614402002, '视频转图片新增', 2024081614402000, '2',  '', '', 1, 0, 'F', '0', '0', 'demo:video2image: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(2024081614402003, '视频转图片修改', 2024081614402000, '3',  '', '', 1, 0, 'F', '0', '0', 'demo:video2image: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(2024081614402004, '视频转图片删除', 2024081614402000, '4',  '', '', 1, 0, 'F', '0', '0', 'demo:video2image: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(2024081614402005, '视频转图片导出', 2024081614402000, '5',  '', '', 1, 0, 'F', '0', '0', 'demo:video2image:export',       '', 1, now(), 1, null, '');

+ 33 - 0
taais-admin/src/main/java/com/taais/web/controller/common/CommonController.java

@@ -113,6 +113,39 @@ public class CommonController {
         }
     }
 
+    /**
+     * 通用上传请求(单个),不修改文件目录
+     */
+    @PostMapping("/uploadPure")
+    public CommonResult<SysOssUploadVo> uploadFilePure(MultipartFile file) throws Exception {
+        try {
+            // 上传文件路径
+            String filePath = TaaisConfig.getUploadPath();
+
+            // 上传并返回新文件名称
+
+            String fileName = FileUploadUtils.uploadPure(filePath, file);
+            String url = serverConfig.getUrl() + fileName;
+            String  originalFilename = file.getOriginalFilename();
+//            Map<String, Object> map = new HashMap<>();
+//            map.put("url", url);
+//            map.put("fileName", fileName);
+//            map.put("newFileName", FileUtils.getName(fileName));
+//            map.put("originalFilename", originalFilename);
+            assert originalFilename != null;
+            String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
+            // 信息保存在文件管理
+            SysOssVo oss = sysOssService.saveResultEntity(file.getOriginalFilename(),suffix, url,fileName);
+            SysOssUploadVo uploadVo = new SysOssUploadVo();
+            uploadVo.setUrl(oss.getUrl());
+            uploadVo.setFileName(oss.getOriginalName());
+            uploadVo.setOssId(oss.getOssId().toString());
+            return CommonResult.success(uploadVo);
+        } catch (Exception e) {
+            return CommonResult.fail(e.getMessage());
+        }
+    }
+
 
 
     /**

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

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

+ 1 - 1
taais-admin/src/main/resources/application-prod.yml

@@ -64,7 +64,7 @@ spring.data:
     # 数据库索引
     database: 0
     # 密码(如没有密码请注释掉)
-    password: CWwYsGjafmv8Sr7g
+    password: Z;G4AS:Vor'YF#p?
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl

+ 56 - 0
taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/FileUploadUtils.java

@@ -77,6 +77,22 @@ public class FileUploadUtils {
         }
     }
 
+    /**
+     * 根据文件路径上传,不修改上传路径
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file    上传的文件
+     * @return 文件名称
+     * @throws IOException
+     */
+    public static final String uploadPure(String baseDir, MultipartFile file) throws IOException {
+        try {
+            return uploadPure(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+        } catch (Exception e) {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+
     /**
      * 文件上传
      *
@@ -107,6 +123,37 @@ public class FileUploadUtils {
         return getPathFileName(baseDir, fileName);
     }
 
+    /**
+     * 文件上传,不编码文件目录
+     *
+     * @param baseDir          相对应用的基目录
+     * @param file             上传的文件
+     * @param allowedExtension 上传文件类型
+     * @return 返回上传成功的文件名
+     * @throws FileSizeLimitExceededException       如果超出最大大小
+     * @throws FileNameLengthLimitExceededException 文件名太长
+     * @throws IOException                          比如读写文件出错时
+     * @throws InvalidExtensionException            文件校验异常
+     */
+    public static final String uploadPure(String baseDir, MultipartFile file, String[] allowedExtension)
+        throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+        InvalidExtensionException {
+        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
+        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
+            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+        }
+
+        assertAllowed(file, allowedExtension);
+
+        String fileName = file.getOriginalFilename();
+        System.out.println("filename is: " + fileName);
+
+        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
+        file.transferTo(Paths.get(absPath));
+
+        return getPathFileName(baseDir, fileName);
+    }
+
     /**
      * 编码文件名
      */
@@ -114,6 +161,15 @@ public class FileUploadUtils {
         return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
             FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
     }
+
+    ///**
+    // * 编码文件名,但不添加后缀和日期
+    // */
+    //public static final String extractFilenamePure(MultipartFile file) {
+    //    return StringUtils.format("{}.{}", DateUtils.datePath(),
+    //        FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
+    //}
+
     public static final String extractFilename2(MultipartFile file) {
         return StringUtils.format("{}/{}.{}", DateUtils.allDatePath(),
             FilenameUtils.getBaseName(file.getOriginalFilename()), getExtension(file));

+ 2 - 2
taais-common/taais-common-core/src/main/java/com/taais/common/core/utils/file/MimeTypeUtils.java

@@ -23,7 +23,7 @@ public class MimeTypeUtils {
     public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
         "asf", "rm", "rmvb"};
 
-    public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"};
+    public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb", "mov", "wmv", "flv"};
 
     public static final String[] DEFAULT_ALLOWED_EXTENSION = {
         // 图片
@@ -33,7 +33,7 @@ public class MimeTypeUtils {
         // 压缩文件
         "rar", "zip", "gz", "bz2",
         // 视频格式
-        "mp4", "avi", "rmvb",
+        "mp4", "avi", "rmvb", "mov", "wmv", "flv",
         // pdf
         "pdf",
         // pt

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

@@ -53,11 +53,17 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-webflux</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.bytedeco</groupId>
+            <artifactId>javacv-platform</artifactId>
+            <version>1.5.7</version>
+        </dependency>
+
         <!--        <dependency>-->
-<!--            <groupId>org.apache.httpcomponents</groupId>-->
-<!--            <artifactId>httpclient</artifactId>-->
-<!--            <version>4.5.14</version>-->
-<!--        </dependency>-->
+        <!--            <groupId>org.apache.httpcomponents</groupId>-->
+        <!--            <artifactId>httpclient</artifactId>-->
+        <!--            <version>4.5.14</version>-->
+        <!--        </dependency>-->
 
     </dependencies>
 

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

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

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

@@ -4,6 +4,13 @@ package com.taais.biz.constant;
  * @author allen
  */
 public class BizConstant {
+    // 视频文件存储目录
+    public static final String UPLOAD_DIR = "uploads/";
+    public class VideoStatus {
+        public static final String NOT_START = "0";
+        public static final String RUNNING = "1";
+        public static final String END = "2";
+    }
 
     public static final String TASK_FOLDER_PATH_HEAD = "/task/";
 

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

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

@@ -1,6 +1,7 @@
 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;
@@ -81,6 +82,11 @@ public class DataController extends BaseController {
         return CommonResult.success(dataService.getFormSelects(field));
     }
 
+    @GetMapping("/batchList")
+    public CommonResult<List<BatchDataResult>> list() {
+        return CommonResult.success(dataService.batchSelect());
+    }
+
     /**
      * 导出数据管理列表
      */

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

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

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

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

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

@@ -0,0 +1,133 @@
+package com.taais.biz.controller;
+
+import java.util.List;
+
+import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
+import com.taais.biz.service.ITargetIdentificationSubtaskService;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.repository.query.Param;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.taais.common.core.core.domain.CommonResult;
+import com.taais.common.excel.utils.ExcelUtil;
+import com.taais.common.log.annotation.Log;
+import com.taais.common.log.enums.BusinessType;
+import com.taais.common.web.annotation.RepeatSubmit;
+import com.taais.common.web.core.BaseController;
+import jakarta.annotation.Resource;
+import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
+import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
+import com.taais.biz.service.ITargetIdentificationTaskService;
+
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 目标识别任务Controller
+ *
+ * @author km
+ * 2024-08-17
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/identification/identificationTask")
+public class TargetIdentificationTaskController extends BaseController {
+    @Resource
+    private ITargetIdentificationTaskService targetIdentificationTaskService;
+
+    /**
+     * 查询目标识别任务列表
+     */
+    @SaCheckPermission("identification:identificationTask:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<TargetIdentificationTaskVo>> list(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        return CommonResult.success(targetIdentificationTaskService.selectPage(targetIdentificationTaskBo));
+    }
+
+    /**
+     * 导出目标识别任务列表
+     */
+    @SaCheckPermission("identification:identificationTask:export")
+    @Log(title = "目标识别任务", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        List<TargetIdentificationTaskVo> list = targetIdentificationTaskService.selectList(targetIdentificationTaskBo);
+        ExcelUtil.exportExcel(list, "目标识别任务", TargetIdentificationTaskVo.class, response);
+    }
+
+    /**
+     * 获取目标识别任务详细信息
+     */
+    @SaCheckPermission("identification:identificationTask:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<TargetIdentificationTaskVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(targetIdentificationTaskService.selectById(id));
+    }
+
+    /**
+     * 新增目标识别任务
+     */
+    @SaCheckPermission("identification:identificationTask:add")
+    @Log(title = "目标识别任务", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        boolean inserted = targetIdentificationTaskService.insert(targetIdentificationTaskBo);
+        if (!inserted) {
+            return CommonResult.fail("新增目标识别任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改目标识别任务
+     */
+    @SaCheckPermission("identification:identificationTask:edit")
+    @Log(title = "目标识别任务", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        Boolean updated = targetIdentificationTaskService.update(targetIdentificationTaskBo);
+        if (!updated) {
+            return CommonResult.fail("修改目标识别任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除目标识别任务
+     */
+    @SaCheckPermission("identification:identificationTask:remove")
+    @Log(title = "目标识别任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = targetIdentificationTaskService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除目标识别任务记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    @PostMapping("/create")
+    public CommonResult<String> createTask(@RequestBody CreateTargetIdentificationTaskDto taskDto) {
+        System.out.println("received task" + taskDto);
+        String errorMsg = targetIdentificationTaskService.createTask(taskDto);
+
+        if (StringUtils.isNotEmpty(errorMsg)) {
+            return CommonResult.fail(errorMsg);
+        } else {
+            return CommonResult.success();
+        }
+    }
+
+    @Log(title = "算法定时任务New", businessType = BusinessType.INSERT)
+    @GetMapping("/taskRun")
+    public CommonResult<Void> taskRun() {
+        targetIdentificationTaskService.taskRun();
+        return CommonResult.success();
+    }
+}

+ 209 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/Video2imageController.java

@@ -0,0 +1,209 @@
+package com.taais.biz.controller;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import com.taais.biz.domain.bo.Video2imageBo;
+import com.taais.biz.domain.vo.Video2imageVo;
+import com.taais.biz.service.IVideo2imageService;
+import com.taais.common.core.core.page.PageResult;
+import com.taais.common.core.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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 org.springframework.web.multipart.MultipartFile;
+
+
+import static com.taais.biz.constant.BizConstant.UPLOAD_DIR;
+import static com.taais.biz.constant.BizConstant.VideoStatus.NOT_START;
+
+/**
+ * 视频转图片Controller
+ *
+ * @author km
+ * 2024-08-16
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/demo/video2image")
+public class Video2imageController extends BaseController {
+
+    @Resource
+    private IVideo2imageService video2imageService;
+
+    /**
+     * 查询视频转图片列表
+     */
+    @SaCheckPermission("demo:video2image:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<Video2imageVo>> list(Video2imageBo video2imageBo) {
+        return CommonResult.success(video2imageService.selectPage(video2imageBo));
+    }
+
+    /**
+     * 导出视频转图片列表
+     */
+    @SaCheckPermission("demo:video2image:export")
+    @Log(title = "视频转图片", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, Video2imageBo video2imageBo) {
+        List<Video2imageVo> list = video2imageService.selectList(video2imageBo);
+        ExcelUtil.exportExcel(list, "视频转图片", Video2imageVo.class, response);
+    }
+
+    /**
+     * 获取视频转图片详细信息
+     */
+    @SaCheckPermission("demo:video2image:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<Video2imageVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(video2imageService.selectById(id));
+    }
+
+    /**
+     * 新增视频转图片
+     */
+    @SaCheckPermission("demo:video2image:add")
+    @Log(title = "视频转图片", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult add(@Validated @RequestBody Video2imageBo video2imageBo) {
+        Video2imageBo newVideo2imageBo = new Video2imageBo();
+        // if (StringUtils.isEmpty(video2imageBo.getFileId())) {
+        //     return CommonResult.fail("请上传视频文件!");
+        // }
+        //
+        // Path filePath = Paths.get(UPLOAD_DIR, video2imageBo.getFileId());
+        // File file = new File(filePath.toString());
+        // if (!file.exists() || !file.isFile()) {
+        //     return CommonResult.fail("视频文件不存在!");
+        // }
+        //
+        // if (video2imageBo.getFps() >= 60 || video2imageBo.getFps() <= 0) {
+        //     return CommonResult.fail("fps值必须在0-60之间!");
+        // }
+
+        newVideo2imageBo.setName(video2imageBo.getName());
+        // newVideo2imageBo.setFileId(video2imageBo.getFileId());
+        newVideo2imageBo.setFps(video2imageBo.getFps());
+        newVideo2imageBo.setStatus(NOT_START);
+        newVideo2imageBo.setPath(video2imageBo.getUrl());
+        newVideo2imageBo.setUrl(video2imageBo.getUrl());
+        // newVideo2imageBo.setPath(Paths.get(UPLOAD_DIR, video2imageBo.getFileId()).toString());
+        newVideo2imageBo.setOutPath(Paths.get(UPLOAD_DIR, video2imageBo.getName(), "images").toString());
+        newVideo2imageBo.setRemarks(video2imageBo.getRemarks());
+
+        boolean inserted = video2imageService.insert(newVideo2imageBo);
+        if (!inserted) {
+            return CommonResult.fail("新增视频转图片记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改视频转图片
+     */
+    @SaCheckPermission("demo:video2image:edit")
+    @Log(title = "视频转图片", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody Video2imageBo video2imageBo) {
+        Boolean updated = video2imageService.update(video2imageBo);
+        if (!updated) {
+            return CommonResult.fail("修改视频转图片记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除视频转图片
+     */
+    @SaCheckPermission("demo:video2image:remove")
+    @Log(title = "视频转图片", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = video2imageService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除视频转图片记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+
+    /**
+     * 此函数弃用,改用系统自带的上传系统
+     * @param file
+     * @return
+     */
+    @PostMapping("/upload")
+    public CommonResult uploadFile(@RequestParam("file") MultipartFile file) {
+        if (file.isEmpty()) {
+            return CommonResult.success("文件不能为空!");
+        }
+
+        try {
+            // 创建上传目录(如果不存在)
+            Path uploadPath = Paths.get(UPLOAD_DIR);
+            if (!Files.exists(uploadPath)) {
+                Files.createDirectories(uploadPath);
+            }
+
+            UUID uuid = UUID.randomUUID();
+            String uuidString = uuid.toString();
+
+            // 获取文件名并构建目标路径
+            String fileName = uuidString + "_" + file.getOriginalFilename();
+            Path targetPath = uploadPath.resolve(fileName);
+
+            // 保存文件到目标路径
+            Files.copy(file.getInputStream(), targetPath);
+
+            return CommonResult.success(fileName, "上传成功");
+        } catch (IOException e) {
+            e.printStackTrace();
+            return CommonResult.success("上传失败");
+        }
+    }
+
+    @GetMapping("/start/{id}")
+    public CommonResult startToImage(@PathVariable("id") Long id) {
+        /**
+         * 传VideoImage的ID
+         */
+        boolean start = video2imageService.startToImage(id);
+        if (start) {
+            return CommonResult.success("操作成功!");
+        } else {
+            return CommonResult.fail("操作失败!");
+        }
+    }
+
+
+    @GetMapping("/zip/{id}")
+    public ResponseEntity<org.springframework.core.io.Resource> zipFolder(@PathVariable("id") Long id) throws IOException {
+        /**
+         * 传VideoImage的ID
+         */
+        return video2imageService.zipImages(id);
+    }
+}

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

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

@@ -20,7 +20,7 @@ import java.util.Date;
 public class Data {
 //    @Serial
 //    private static final long serialVersionUID = 1L;
-
+    @Id(keyType = KeyType.None)
     private Long id;
 
     /** 名称 */
@@ -39,7 +39,7 @@ public class Data {
     private String objectSubtype;
 
     /** 批次号 */
-    private Long batchNum;
+    private String batchNum;
 
     /** 场景 */
     private String scene;

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

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

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

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

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

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

+ 99 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/Video2image.java

@@ -0,0 +1,99 @@
+package com.taais.biz.domain;
+
+import java.util.Date;
+
+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;
+
+/**
+ * 视频转图片 对象 video2image
+ *
+ * @author km
+ * 2024-08-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "video2image")
+public class Video2image extends BaseEntity {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @Id
+    private Long id;
+
+    /**
+     * 视频名称
+     */
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    private String status;
+
+    /**
+     * 切割好的图片的保存路径
+     */
+    private String outPath;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 耗时
+     */
+    private Long costSecond;
+
+    /**
+     * 日志
+     */
+    private String log;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 逻辑删除标志(0代表存在 1代表删除)
+     */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+    /**
+     * 视频本身保存路径
+     */
+    private String path;
+
+    /**
+     * 切割帧率,默认1
+     */
+    private Long fps;
+
+    /**
+     * 获取视频的url
+     */
+    private String url;
+
+    /**
+     * 图片压缩包路径
+     */
+    private String zipFilePath;
+}

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

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

+ 102 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/Video2imageBo.java

@@ -0,0 +1,102 @@
+package com.taais.biz.domain.bo;
+
+
+import com.taais.biz.domain.Video2image;
+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;
+
+/**
+ * 【请填写功能名称】业务对象 video2image
+ *
+ * @author km
+ * @date 2024-08-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Video2image.class, reverseConvertGenerate = false)
+public class Video2imageBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 视频名称
+     */
+    @NotBlank(message = "视频名称不能为空")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    // @NotBlank(message = "任务状态不能为空")
+    private String status;
+
+    /**
+     * 切割好的图片的保存路径
+     */
+    // @NotBlank(message = "切割好的图片的保存路径不能为空")
+    private String outPath;
+
+    /**
+     * 开始时间
+     */
+    // @NotNull(message = "开始时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    // @NotNull(message = "结束时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+    /**
+     * 耗时
+     */
+    // @NotNull(message = "耗时不能为空")
+    private Long costSecond;
+
+    /**
+     * 日志
+     */
+    // @NotBlank(message = "日志不能为空")
+    private String log;
+
+    /**
+     * 备注
+     */
+    // @NotBlank(message = "备注不能为空")
+    private String remarks;
+
+    /**
+     * 视频本身保存路径
+     */
+    // @NotBlank(message = "视频本身保存路径不能为空")
+    private String path;
+
+    /**
+     * 切割帧率,默认1
+     */
+    @NotNull(message = "切割帧率,默认1不能为空")
+    @Min(value = 1, message = "切割帧率,最小值为1")
+    @Max(value = 60, message = "切割帧率,最大值为60")
+    private Long fps;
+
+    /**
+     * 视频文件ID
+     */
+    private String fileId;
+
+    /**
+     * 获取视频的url
+     */
+    @NotBlank(message = "视频url不能为空")
+    private String url;
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,95 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+import lombok.NoArgsConstructor;
+
+/**
+ * 视频转图片 导入视图对象 video2image
+ *
+ * @author km
+ * @date 2024-08-16
+ */
+
+@Data
+@NoArgsConstructor
+public class Video2imageImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 视频名称
+     */
+    @ExcelProperty(value = "视频名称")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+    /**
+     * 切割好的图片的保存路径
+     */
+    @ExcelProperty(value = "切割好的图片的保存路径")
+    private String outPath;
+
+    /**
+     * 开始时间
+     */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+    /**
+     * 耗时
+     */
+    @ExcelProperty(value = "耗时")
+    private Long costSecond;
+
+    /**
+     * 日志
+     */
+    @ExcelProperty(value = "日志")
+    private String log;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 逻辑删除标志(0代表存在 1代表删除)
+     */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+    /**
+     * 视频本身保存路径
+     */
+    @ExcelProperty(value = "视频本身保存路径")
+    private String path;
+
+    /**
+     * 切割帧率,默认1
+     */
+    @ExcelProperty(value = "切割帧率,默认1")
+    private Long fps;
+
+
+}

+ 103 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/Video2imageVo.java

@@ -0,0 +1,103 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.biz.domain.Video2image;
+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;
+
+/**
+ * 视频转图片 视图对象 video2image
+ *
+ * @author km
+ * @date 2024-08-16
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Video2image.class)
+public class Video2imageVo 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 outPath;
+
+    /**
+     * 开始时间
+     */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+    /**
+     * 耗时
+     */
+    @ExcelProperty(value = "耗时")
+    private Long costSecond;
+
+    /**
+     * 日志
+     */
+    @ExcelProperty(value = "日志")
+    private String log;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 逻辑删除标志(0代表存在 1代表删除)
+     */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+    /**
+     * 视频本身保存路径
+     */
+    @ExcelProperty(value = "视频本身保存路径")
+    private String path;
+
+    /**
+     * 切割帧率,默认1
+     */
+    @ExcelProperty(value = "切割帧率,默认1")
+    private Long fps;
+}

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

+ 119 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/listener/Video2imageImportListener.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.biz.domain.bo.Video2imageBo;
+import com.taais.biz.domain.vo.Video2imageImportVo;
+import com.taais.biz.domain.vo.Video2imageVo;
+import com.taais.biz.service.IVideo2imageService;
+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 lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 视频转图片自定义导入
+ *
+ * @author km
+ */
+@Slf4j
+public class Video2imageImportListener extends AnalysisEventListener<Video2imageImportVo> implements ExcelListener<Video2imageImportVo> {
+    private final IVideo2imageService video2imageService;
+
+    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 Video2imageImportListener(Boolean isUpdateSupport) {
+        this.video2imageService = SpringUtils.getBean(IVideo2imageService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(Video2imageImportVo video2imageVo, AnalysisContext context) {
+        try {
+
+            Video2imageBo video2imageBo = BeanUtil.toBean(video2imageVo, Video2imageBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            Video2imageVo video2imageVo1 = null;
+
+            //video2imageVo1 = video2imageService.selectBySomefield(video2imageVo.getSomefield());
+            if (ObjectUtil.isNull(video2imageVo1)) {
+                //不存在就新增
+                video2imageBo.setVersion(0);
+                ValidatorUtils.validate(video2imageBo);
+                boolean inserted = video2imageService.insert(video2imageBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、视频转图片 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、视频转图片 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                video2imageBo.setId(video2imageVo1.getId());//主键
+                video2imageBo.setVersion(video2imageVo1.getVersion());
+                boolean updated = video2imageService.update(video2imageBo);
+                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<Video2imageImportVo> 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<Video2imageImportVo> 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> {
+
+}

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

@@ -2,6 +2,7 @@ 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;
@@ -20,5 +21,7 @@ public interface DataMapper extends BaseMapper<Data> {
 
     List<Long> getIds(@Param("size") Integer size);
 
+    List<BatchDataResult> getBatchData();
+
     List<DataSelectVo> getFormSelects(@Param("field") String field);
 }

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

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

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

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

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

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

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

@@ -0,0 +1,16 @@
+package com.taais.biz.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.Video2image;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 视频转图片 Mapper接口
+ *
+ * @author km
+ * 2024-08-16
+ */
+@Mapper
+public interface Video2imageMapper extends BaseMapper<Video2image> {
+
+}

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

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

@@ -5,6 +5,7 @@ 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;
@@ -21,6 +22,13 @@ import org.springframework.web.multipart.MultipartFile;
  * 2024-06-14
  */
 public interface IDataService extends IBaseService<Data> {
+    /**
+     * 查询批次情况
+     *
+     * @return 数据批次信息
+     */
+    List<BatchDataResult> batchSelect();
+
     /**
      * 查询数据管理
      *

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

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

@@ -0,0 +1,71 @@
+package com.taais.biz.service;
+
+import com.taais.biz.domain.Video2image;
+import com.taais.biz.domain.bo.Video2imageBo;
+import com.taais.biz.domain.vo.Video2imageVo;
+import com.taais.common.core.core.page.PageResult;
+import com.taais.common.orm.core.service.IBaseService;
+import org.springframework.core.io.Resource;
+import org.springframework.http.ResponseEntity;
+
+import java.util.List;
+
+/**
+ * 视频转图片 Service接口
+ *
+ * @author km
+ * 2024-08-16
+ */
+public interface IVideo2imageService extends IBaseService<Video2image> {
+    /**
+     * 查询视频转图片
+     *
+     * @param id 视频转图片主键
+     * @return 视频转图片
+     */
+    Video2imageVo selectById(Long id);
+
+    /**
+     * 查询视频转图片列表
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 视频转图片集合
+     */
+    List<Video2imageVo> selectList(Video2imageBo video2imageBo);
+
+    /**
+     * 分页查询视频转图片列表
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 分页视频转图片集合
+     */
+    PageResult<Video2imageVo> selectPage(Video2imageBo video2imageBo);
+
+    /**
+     * 新增视频转图片
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(Video2imageBo video2imageBo);
+
+    /**
+     * 修改视频转图片
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(Video2imageBo video2imageBo);
+
+    /**
+     * 批量删除视频转图片
+     *
+     * @param ids 需要删除的视频转图片主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+    boolean startToImage(Long id);
+
+    ResponseEntity<Resource> zipImages(Long id);
+}

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

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

@@ -10,6 +10,7 @@ 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;
@@ -113,6 +114,11 @@ public class DataServiceImpl extends BaseServiceImpl<DataMapper, Data> implement
         return queryWrapper;
     }
 
+    @Override
+    public List<BatchDataResult> batchSelect() {
+        return dataMapper.getBatchData();
+    }
+
     /**
      * 查询数据管理
      *
@@ -122,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);
     }
 
     /**

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

@@ -0,0 +1,159 @@
+package com.taais.biz.service.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.common.core.utils.MapstructUtils;
+import com.taais.common.core.utils.StringUtils;
+import com.taais.common.orm.core.page.PageQuery;
+import com.taais.common.core.core.page.PageResult;
+import com.taais.common.orm.core.service.impl.BaseServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.taais.biz.mapper.TargetIdentificationSubtaskDetailsMapper;
+import com.taais.biz.domain.TargetIdentificationSubtaskDetails;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskDetailsVo;
+import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
+import static com.taais.biz.domain.table.TargetIdentificationSubtaskDetailsTableDef.TARGET_IDENTIFICATION_SUBTASK_DETAILS;
+
+/**
+ * 目标识别子任务Service业务层处理
+ *
+ * @author 0
+ * 2024-08-17
+ */
+@Service
+public class TargetIdentificationSubtaskDetailsServiceImpl extends BaseServiceImpl<TargetIdentificationSubtaskDetailsMapper, TargetIdentificationSubtaskDetails> implements ITargetIdentificationSubtaskDetailsService {
+    @Resource
+    private TargetIdentificationSubtaskDetailsMapper targetIdentificationSubtaskDetailsMapper;
+
+
+    public List<TargetIdentificationSubtaskDetailsBo> getTargetIdentificationSubtaskDetailsListBySubtaskId(Long subtaskId) {
+        return targetIdentificationSubtaskDetailsMapper.getTargetIdentificationSubtaskDetailsListBySubtaskId(subtaskId);
+    }
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(TARGET_IDENTIFICATION_SUBTASK_DETAILS);
+    }
+
+    private QueryWrapper buildQueryWrapper(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.NAME.like
+        (targetIdentificationSubtaskDetailsBo.getName()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.SUBTASK_ID.eq
+            (targetIdentificationSubtaskDetailsBo.getSubtaskId()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.STATUS.eq
+        (targetIdentificationSubtaskDetailsBo.getStatus()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.ALGORITHM_ID.eq
+        (targetIdentificationSubtaskDetailsBo.getAlgorithmId()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.DATA_BATCH_NUMS.eq
+        (targetIdentificationSubtaskDetailsBo.getDataBatchNums()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.PARAMETERS.eq
+        (targetIdentificationSubtaskDetailsBo.getParameters()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.PREPROCESS_PATH.eq
+        (targetIdentificationSubtaskDetailsBo.getPreprocessPath()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.RESULT_PATH.eq
+        (targetIdentificationSubtaskDetailsBo.getResultPath()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.INDEX.eq
+        (targetIdentificationSubtaskDetailsBo.getIndex()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.START_TIME.eq
+        (targetIdentificationSubtaskDetailsBo.getStartTime()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.END_TIME.eq
+        (targetIdentificationSubtaskDetailsBo.getEndTime()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.COST_SECOND.eq
+        (targetIdentificationSubtaskDetailsBo.getCostSecond()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.LOG.eq
+        (targetIdentificationSubtaskDetailsBo.getLog()));
+        queryWrapper.and(TARGET_IDENTIFICATION_SUBTASK_DETAILS.REMARKS.eq
+        (targetIdentificationSubtaskDetailsBo.getRemarks()));
+        return queryWrapper;
+    }
+
+    /**
+     * 查询目标识别子任务
+     *
+     * @param id 目标识别子任务主键
+     * @return 目标识别子任务
+     */
+    @Override
+    public TargetIdentificationSubtaskDetailsVo selectById(Long id) {
+            return this.getOneAs(query().where(TARGET_IDENTIFICATION_SUBTASK_DETAILS.ID.eq(id)), TargetIdentificationSubtaskDetailsVo.class);
+
+    }
+
+    /**
+     * 查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 目标识别子任务集合
+     */
+    @Override
+    public List<TargetIdentificationSubtaskDetailsVo> selectList(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationSubtaskDetailsBo);
+            return this.listAs(queryWrapper, TargetIdentificationSubtaskDetailsVo.class);
+    }
+
+    /**
+     * 分页查询目标识别子任务列表
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 分页目标识别子任务集合
+     */
+    @Override
+    public PageResult<TargetIdentificationSubtaskDetailsVo> selectPage(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationSubtaskDetailsBo);
+            Page<TargetIdentificationSubtaskDetailsVo> page = this.pageAs(PageQuery.build(), queryWrapper, TargetIdentificationSubtaskDetailsVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增目标识别子任务
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        TargetIdentificationSubtaskDetails targetIdentificationSubtaskDetails =MapstructUtils.convert(targetIdentificationSubtaskDetailsBo, TargetIdentificationSubtaskDetails. class);
+        targetIdentificationSubtaskDetails.setSubtaskId(targetIdentificationSubtaskDetailsBo.getSubtaskId());
+        targetIdentificationSubtaskDetails.setType(targetIdentificationSubtaskDetailsBo.getType());
+        System.out.println("convert subdetail: " + targetIdentificationSubtaskDetails);
+        System.out.println("convert before subdetail: " + targetIdentificationSubtaskDetailsBo);
+        return this.save(targetIdentificationSubtaskDetails);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @param targetIdentificationSubtaskDetailsBo 目标识别子任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(TargetIdentificationSubtaskDetailsBo targetIdentificationSubtaskDetailsBo) {
+        TargetIdentificationSubtaskDetails targetIdentificationSubtaskDetails =MapstructUtils.convert(targetIdentificationSubtaskDetailsBo, TargetIdentificationSubtaskDetails. class);
+        if (ObjectUtil.isNotNull(targetIdentificationSubtaskDetails) && ObjectUtil.isNotNull(targetIdentificationSubtaskDetails.getId())){
+            boolean updated = this.updateById(targetIdentificationSubtaskDetails);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除目标识别子任务
+     *
+     * @param ids 需要删除的目标识别子任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

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

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

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

@@ -0,0 +1,375 @@
+package com.taais.biz.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.esotericsoftware.minlog.Log;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.TargetIdentificationSubtask;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
+import com.taais.biz.domain.dto.task.TaskDto;
+import com.taais.biz.domain.vo.AlgorithmModelVo;
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
+import com.taais.biz.domain.vo.DataVo;
+import com.taais.biz.service.*;
+import com.taais.common.core.utils.MapstructUtils;
+import com.taais.common.core.utils.StringUtils;
+import com.taais.common.core.utils.uuid.UUID;
+import com.taais.common.orm.core.page.PageQuery;
+import com.taais.common.core.core.page.PageResult;
+import com.taais.common.orm.core.service.impl.BaseServiceImpl;
+import jakarta.annotation.Resource;
+import org.apache.commons.io.FileUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.taais.biz.mapper.TargetIdentificationTaskMapper;
+import com.taais.biz.domain.TargetIdentificationTask;
+import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
+import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
+
+import static com.taais.biz.domain.table.TargetIdentificationTaskTableDef.TARGET_IDENTIFICATION_TASK;
+
+/**
+ * 目标识别任务Service业务层处理
+ *
+ * @author km
+ * 2024-08-17
+ */
+@Service
+public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetIdentificationTaskMapper, TargetIdentificationTask> implements ITargetIdentificationTaskService {
+    @Resource
+    private TargetIdentificationTaskMapper targetIdentificationTaskMapper;
+
+    @Resource
+    private ITargetIdentificationSubtaskService subtaskService;
+    @Resource
+    private ITargetIdentificationSubtaskDetailsService subtaskDetailsService;
+
+    @Resource
+    private IAlgorithmTaskConfigurationService algorithmTaskConfigurationService;
+
+    @Resource
+    private DataServiceImpl dataService;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(TARGET_IDENTIFICATION_TASK);
+    }
+
+    private QueryWrapper buildQueryWrapper(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(TARGET_IDENTIFICATION_TASK.NAME.like
+        (targetIdentificationTaskBo.getName()));
+        queryWrapper.and(TARGET_IDENTIFICATION_TASK.STATUS.eq
+        (targetIdentificationTaskBo.getStatus()));
+        queryWrapper.and(TARGET_IDENTIFICATION_TASK.REMARKS.eq
+        (targetIdentificationTaskBo.getRemarks()));
+        return queryWrapper;
+    }
+
+    /**
+     * 查询目标识别任务
+     *
+     * @param id 目标识别任务主键
+     * @return 目标识别任务
+     */
+    @Override
+    public TargetIdentificationTaskVo selectById(Long id) {
+            return this.getOneAs(query().where(TARGET_IDENTIFICATION_TASK.ID.eq(id)), TargetIdentificationTaskVo.class);
+
+    }
+
+    /**
+     * 查询目标识别任务列表
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 目标识别任务集合
+     */
+    @Override
+    public List<TargetIdentificationTaskVo> selectList(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationTaskBo);
+            return this.listAs(queryWrapper, TargetIdentificationTaskVo.class);
+    }
+
+    /**
+     * 分页查询目标识别任务列表
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 分页目标识别任务集合
+     */
+    @Override
+    public PageResult<TargetIdentificationTaskVo> selectPage(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(targetIdentificationTaskBo);
+            Page<TargetIdentificationTaskVo> page = this.pageAs(PageQuery.build(), queryWrapper, TargetIdentificationTaskVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增目标识别任务
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+    TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
+        System.out.println("Insert task: " + targetIdentificationTask);
+
+        boolean result = this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
+
+        System.out.println("Insert task: " + targetIdentificationTask);
+
+        return result;
+    }
+
+    public TargetIdentificationTask insertTask(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
+
+        boolean result = this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
+
+        System.out.println("Insert task: " + targetIdentificationTask);
+
+        return targetIdentificationTask;
+    }
+
+    /**
+     * 修改目标识别任务
+     *
+     * @param targetIdentificationTaskBo 目标识别任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(TargetIdentificationTaskBo targetIdentificationTaskBo) {
+        TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
+        if (ObjectUtil.isNotNull(targetIdentificationTask) && ObjectUtil.isNotNull(targetIdentificationTask.getId())){
+            boolean updated = this.updateById(targetIdentificationTask);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除目标识别任务
+     *
+     * @param ids 需要删除的目标识别任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+    @Override
+    public void taskRun() {
+        TargetIdentificationTask task = targetIdentificationTaskMapper.getAvailableTask();
+        if (task == null) {
+            return;
+        }
+        subtaskService.taskRun(task);
+    }
+
+    @Override
+    @Transactional
+    public String createTask(CreateTargetIdentificationTaskDto taskDto) {
+        String errorMsg = "";
+        // 检查数据是否有问题
+        errorMsg = checkTask(taskDto);
+
+        if (StringUtils.isNotEmpty(errorMsg)){
+            return errorMsg;
+        }
+        // 创建任务
+        TargetIdentificationTaskBo taskBo = new TargetIdentificationTaskBo();
+        taskBo.setName(taskDto.getTaskName());
+        taskBo.setStatus(BizConstant.TASK_STATUS_PENDING);
+        TargetIdentificationTask task = this.insertTask(taskBo);
+        taskBo.setId(task.getId());
+        System.out.println("taskBo is: " + taskBo);
+
+        // 创建训练子任务
+        if(taskDto.getTaskItemList().contains(CreateTargetIdentificationTaskDto.TASK_TYPE_SINGLE_DATA_AND_MORE_ALGORITHM)){
+            createTrainTask(taskBo.getId(),taskDto);
+        }
+        // 创建测试子任务
+        if (taskDto.getTaskItemList().contains(CreateTargetIdentificationTaskDto.TASK_TYPE_SINGLE_DATA_AND_MORE_ALGORITHM)){
+            createTestTask(taskBo.getId(),taskDto);
+        }
+        return null;
+    }
+
+    private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+        List<TaskDto> algTaskList = taskDto.getAlgTaskList();
+        List<String> trainBatchNumList = taskDto.getTrainBatchNumList();
+        if (trainBatchNumList.isEmpty()) {
+            return;
+        }
+        TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
+        subtask.setName("训练");
+        subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
+        subtask.setTaskId(taskId);
+        subtask.setRemarks("DEFAULT_REMARK");
+
+        TargetIdentificationSubtask savedTask = subtaskService.insertSubtask(subtask);
+        subtask.setId(savedTask.getId());
+        System.out.println("subtask is: " + subtask);
+
+        for (TaskDto algTask : algTaskList) {
+            // 通过算法id 获取算法配置
+            Long algorithmId = algTask.getAlgorithmId();
+            AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
+
+            String algUrl = algorithmModelVo.getTestUrl();
+            String algName = algorithmModelVo.getName();
+            List<String> params = List.of(algTask.getParams().split(";;;"));
+
+            for (int i = 0; i < trainBatchNumList.size(); i++) {
+                String batchNum = trainBatchNumList.get(i);
+                TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
+                // 通过算法id获取算法配置
+                subtaskDetail.setSubtaskId(subtask.getId());
+                subtaskDetail.setName(algName);
+                subtaskDetail.setStatus(BizConstant.TASK_STATUS_PENDING);
+                subtaskDetail.setAlgorithmId(algTask.getAlgorithmId());
+                subtaskDetail.setType(algUrl);
+                subtaskDetail.setDataBatchNums(batchNum);
+                subtaskDetail.setParameters(params.get(0));
+                // todo 获取预处理路径
+                String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                subtaskDetail.setPreprocessPath(subtaskPath);
+                subtaskDetail.setResultPath(subtaskPath + "/result");
+                subtaskDetail.setIndex((long) i);
+                copyFilesToPath(batchNum, subtaskPath);
+
+                subtaskDetailsService.insert(subtaskDetail);
+            }
+        }
+    }
+
+    public static final String PATH_PREFIX = "ObjectDetection_Web/task";
+    /**
+     * 移动文件到对应文件夹
+     * @param batch
+     * @param path
+     */
+    private void copyFilesToPath(String batch, String path) {
+        String[] batches = batch.split(",");
+
+        File dir = new File(PATH_PREFIX + path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        dir = new File(PATH_PREFIX + path + "/images");
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        dir = new File(PATH_PREFIX + path + "/labels");
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        dir = new File(PATH_PREFIX + path + "/result");
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        System.out.println(dir.getAbsolutePath());
+
+        for (String batchNum : batches) {
+            List<DataVo> dataVoList = dataService.getDataByBatchNum(batchNum);
+            for (DataVo dataVo : dataVoList) {
+                String[] strings = dataVo.getUrl().split("/profile");
+                String relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                File file = new File(relativePath);
+                System.out.println(file.getAbsolutePath());
+                if (file.exists()) {
+                    try {
+                        File dist = new File(PATH_PREFIX + path + "/images/" + file.getName());
+                        FileUtils.copyFile(file, dist);
+                        System.out.println("file dist: " + dist.getAbsolutePath());
+                    } catch (IOException e) {
+                        Log.debug("bug found");
+                        continue;
+                    }
+                }
+                if (dataVo.getLabelurl() != null) {
+                    strings = dataVo.getLabelurl().split("/profile");
+                    relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
+                    file = new File(relativePath);
+                    if (file.exists()) {
+                        try {
+                            File dist = new File(PATH_PREFIX + path + "/labels/" + file.getName());
+                            FileUtils.copyFile(file, dist);
+                            System.out.println("file dist: " + dist.getAbsolutePath());
+                        } catch (IOException e) {
+                            Log.debug("bug found");
+                            continue;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+        List<TaskDto> algTaskList = taskDto.getAlgTaskList();
+        List<String> testBatchNumList = taskDto.getTestBatchNumList();
+        if (testBatchNumList.isEmpty()) {
+            return;
+        }
+        TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
+        subtask.setName("测试");
+        subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
+        subtask.setTaskId(taskId);
+        subtask.setRemarks("DEFAULT_REMARK");
+
+        TargetIdentificationSubtask savedTask = subtaskService.insertSubtask(subtask);
+        subtask.setId(savedTask.getId());
+        System.out.println("subtask is: " + subtask);
+
+        for (TaskDto algTask : algTaskList) {
+            // 通过算法id 获取算法配置
+            Long algorithmId = algTask.getAlgorithmId();
+            AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
+
+            String algUrl = algorithmModelVo.getTestUrl();
+            String algName = algorithmModelVo.getName();
+            List<String> params = List.of(algTask.getParams().split(";;;"));
+
+            for (int i = 0; i < testBatchNumList.size(); i++) {
+                String batchNum = testBatchNumList.get(i);
+                TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
+                // 通过算法id获取算法配置
+                subtaskDetail.setSubtaskId(subtask.getId());
+                subtaskDetail.setName(algName);
+                subtaskDetail.setStatus(BizConstant.TASK_STATUS_PENDING);
+                subtaskDetail.setAlgorithmId(algTask.getAlgorithmId());
+                subtaskDetail.setType(algUrl);
+                subtaskDetail.setDataBatchNums(batchNum);
+                subtaskDetail.setParameters(params.get(2));
+                // todo 获取预处理路径
+                String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
+                subtaskDetail.setPreprocessPath(subtaskPath);
+                subtaskDetail.setResultPath(subtaskPath + "/result");
+                subtaskDetail.setIndex((long) i);
+                copyFilesToPath(batchNum, subtaskPath);
+
+                subtaskDetailsService.insert(subtaskDetail);
+            }
+        }
+    }
+
+
+    // todo 检查数据是否有问题
+    private String checkTask(CreateTargetIdentificationTaskDto taskDto) {
+        return null;
+    }
+
+}

+ 247 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/Video2imageServiceImpl.java

@@ -0,0 +1,247 @@
+package com.taais.biz.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.domain.Video2image;
+import com.taais.biz.domain.bo.Video2imageBo;
+import com.taais.biz.domain.vo.Video2imageVo;
+import com.taais.biz.mapper.Video2imageMapper;
+import com.taais.biz.service.IVideo2imageService;
+import com.taais.common.core.utils.MapstructUtils;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import static com.taais.biz.constant.BizConstant.VideoStatus.END;
+import static com.taais.biz.constant.BizConstant.VideoStatus.RUNNING;
+import static com.taais.biz.domain.table.Video2imageTableDef.VIDEO2IMAGE;
+
+import com.taais.biz.utils.VideoCapture;
+import com.taais.biz.utils.ZipUtils;
+
+/**
+ * 视频转图片 Service业务层处理
+ *
+ * @author km
+ * 2024-08-16
+ */
+@Service
+@Slf4j
+public class Video2imageServiceImpl extends BaseServiceImpl<Video2imageMapper, Video2image> implements IVideo2imageService {
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(VIDEO2IMAGE);
+    }
+
+    private QueryWrapper buildQueryWrapper(Video2imageBo video2imageBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(VIDEO2IMAGE.NAME.like
+            (video2imageBo.getName()));
+        queryWrapper.and(VIDEO2IMAGE.STATUS.eq
+            (video2imageBo.getStatus()));
+        queryWrapper.and(VIDEO2IMAGE.OUT_PATH.eq
+            (video2imageBo.getOutPath()));
+        queryWrapper.and(VIDEO2IMAGE.START_TIME.eq
+            (video2imageBo.getStartTime()));
+        queryWrapper.and(VIDEO2IMAGE.END_TIME.eq
+            (video2imageBo.getEndTime()));
+        queryWrapper.and(VIDEO2IMAGE.COST_SECOND.eq
+            (video2imageBo.getCostSecond()));
+        queryWrapper.and(VIDEO2IMAGE.LOG.eq
+            (video2imageBo.getLog()));
+        queryWrapper.and(VIDEO2IMAGE.REMARKS.eq
+            (video2imageBo.getRemarks()));
+        queryWrapper.and(VIDEO2IMAGE.PATH.eq
+            (video2imageBo.getPath()));
+        queryWrapper.and(VIDEO2IMAGE.FPS.eq
+            (video2imageBo.getFps()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询视频转图片
+     *
+     * @param id 视频转图片主键
+     * @return 视频转图片
+     */
+    @Override
+    public Video2imageVo selectById(Long id) {
+        return this.getOneAs(query().where(VIDEO2IMAGE.ID.eq(id)), Video2imageVo.class);
+
+    }
+
+    /**
+     * 查询视频转图片列表
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 视频转图片集合
+     */
+    @Override
+    public List<Video2imageVo> selectList(Video2imageBo video2imageBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(video2imageBo);
+        return this.listAs(queryWrapper, Video2imageVo.class);
+    }
+
+    /**
+     * 分页查询视频转图片列表
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 分页视频转图片集合
+     */
+    @Override
+    public PageResult<Video2imageVo> selectPage(Video2imageBo video2imageBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(video2imageBo);
+        Page<Video2imageVo> page = this.pageAs(PageQuery.build(), queryWrapper, Video2imageVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增视频转图片
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(Video2imageBo video2imageBo) {
+        Video2image video2image = MapstructUtils.convert(video2imageBo, Video2image.class);
+
+        return this.save(video2image);// 使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 修改视频转图片
+     *
+     * @param video2imageBo 视频转图片Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(Video2imageBo video2imageBo) {
+        Video2image video2image = MapstructUtils.convert(video2imageBo, Video2image.class);
+        if (ObjectUtil.isNotNull(video2image) && ObjectUtil.isNotNull(video2image.getId())) {
+            boolean updated = this.updateById(video2image);
+            return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除视频转图片
+     *
+     * @param ids 需要删除的视频转图片主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+
+    public void updateStatusToEnd(Long id, String log) {
+        Video2image video2image = this.getById(id);
+        video2image.setStatus(END);
+        video2image.setLog(log);
+        video2image.setEndTime(new Date());
+        video2image.setCostSecond((video2image.getEndTime().getTime() - video2image.getStartTime().getTime()) / 1000);
+        this.updateById(video2image);
+    }
+
+    @Override
+    public boolean startToImage(Long id) {
+        Video2image video2image = this.getById(id);
+        if (ObjectUtil.isNull(video2image)) {
+            log.info("ObjectUtil.isNotNull(video2image)...");
+            return false;
+        }
+        log.info("开始截取图片...");
+
+        String videoPath = video2image.getPath();
+        String outPath = video2image.getOutPath();
+        Long fps = video2image.getFps();
+
+        log.info("videoPath: " + videoPath);
+        log.info("outPath: " + outPath);
+        log.info("fps: " + fps);
+
+        // File file = new File(videoPath);
+        // if (!file.exists() || !file.isFile()) {
+        //     log.error("文件不存在...");
+        //     return false;
+        // }
+
+        video2image.setStatus(RUNNING);
+        video2image.setStartTime(new Date());
+        this.updateById(video2image);
+
+        new Thread(() -> {
+            String log_str = "";
+            log.info("开始截取图片子线程...");
+            log.info("开始截取图片...");
+
+            log_str += "开始截取图片子线程...\n";
+            log_str += "开始截取图片...\n";
+            try {
+                VideoCapture.startCaputreFromUrl(videoPath, outPath, fps);
+                log.info("视频转图片结束...");
+                log_str += "视频转图片结束...\n";
+
+                log.info("开始压缩图片...");
+                log_str += "开始压缩图片...\n";
+                String zipFilePath = Paths.get(outPath).resolveSibling(video2image.getName() + ".zip").toString();
+                ZipUtils.zipFolderFiles(outPath, zipFilePath);
+
+                log_str += "压缩图片成功...\n";
+                log.info("压缩图片成功...");
+            } catch (Exception e) {
+                e.printStackTrace();
+                log_str += "视频转图片出现位置错误...\n" + e.getMessage() + "\n";
+                log.error("视频转图片出现位置错误...", e);
+            }
+            updateStatusToEnd(id, log_str);
+            log.info("视频转图片子线程结束...");
+        }).start();
+
+        return true;
+    }
+
+    @Override
+    public ResponseEntity<Resource> zipImages(Long id) {
+        Video2image video2image = this.getById(id);
+        if (ObjectUtil.isNull(video2image)) {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+        }
+
+        String sourceFolderPath = video2image.getOutPath();
+        String zipFilePath = Paths.get(sourceFolderPath).resolveSibling(video2image.getName() + ".zip").toString();
+
+        File file = new File(zipFilePath);
+
+        if (!file.exists() || !file.isFile()) {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+        }
+
+        org.springframework.core.io.Resource resource = new FileSystemResource(file);
+        return ResponseEntity.ok()
+            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
+            .header(HttpHeaders.CONTENT_TYPE, "application/octet-stream")
+            .body(resource);
+    }
+}

+ 174 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/utils/VideoCapture.java

@@ -0,0 +1,174 @@
+/**
+ * @Datetime : 2024-08-17 11:04:20
+ * @Author : WANGKANG
+ * @Email : 1686617586@qq.com
+ * @Blog :
+ * @File : VideoCapture.java
+ * @brief : 视频转图片工具类
+ */
+
+package com.taais.biz.utils;
+
+import java.io.IOException;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.Frame;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+
+import org.bytedeco.javacv.Java2DFrameConverter;
+
+
+import org.bytedeco.opencv.opencv_core.Stream;
+
+public class VideoCapture {
+    /**
+     * 截取视频帧并保存为图片
+     * 设置唯一视频名称,保存到指定的路径下
+     *
+     * @param filePath   视频文件路径
+     * @param savePath__ 图片保存路径
+     * @param fps        帧率
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    public static void startCaputreFromFile(String filePath, String savePath__, Long fps)
+        throws IOException {
+        FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(filePath);
+
+        Path savePath = Paths.get(savePath__);
+        if (Files.exists(savePath)) {
+            System.out.println("目录已存在: " + savePath);
+            System.out.println("清空里面的内容");
+            try {
+                deleteDirectory(savePath);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        Files.createDirectories(savePath);
+
+        System.out.println("--- 开始截图 ---");
+        grabber.start();
+        long current_time_stamp = 0;
+        long current_time_stamp_step = 1000000 / fps;
+        int idx = 0;
+        while (true) {
+            Frame frame = grabber.grabImage();
+            if (frame != null) {
+                // System.out.println(frame.timestamp);
+                if (frame.timestamp >= current_time_stamp) {
+                    idx += 1;
+                    current_time_stamp += current_time_stamp_step;
+                    saveImage(frame, savePath__, idx);
+                }
+            } else {
+                break;
+            }
+        }
+        grabber.stop();
+        grabber.release();
+        System.out.println("--- 截图完成---");
+    }
+
+    public static void startCaputreFromUrl(String videoUrl, String savePath__, Long fps)
+        throws IOException {
+        FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(videoUrl);
+        grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
+
+        Path savePath = Paths.get(savePath__);
+        if (Files.exists(savePath)) {
+            System.out.println("目录已存在: " + savePath);
+            System.out.println("清空里面的内容");
+            try {
+                deleteDirectory(savePath);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        Files.createDirectories(savePath);
+
+        System.out.println("--- 开始截图 ---");
+        grabber.start();
+        long current_time_stamp = 0;
+        long current_time_stamp_step = 1000000 / fps;
+        int idx = 0;
+        while (true) {
+            Frame frame = grabber.grabImage();
+            if (frame != null) {
+                // System.out.println(frame.timestamp);
+                if (frame.timestamp >= current_time_stamp) {
+                    idx += 1;
+                    current_time_stamp += current_time_stamp_step;
+                    saveImage(frame, savePath__, idx);
+                }
+            } else {
+                break;
+            }
+        }
+        grabber.stop();
+        grabber.release();
+        System.out.println("--- 截图完成---");
+    }
+
+    public static boolean saveImage(Frame frame, String savePath, int idx) {
+        try {
+            Path outPath =  Paths.get(savePath, String.format("%05d", idx) + "_" + System.currentTimeMillis() + ".jpg");
+            // System.out.println("图片已保存:" + outPath);
+            File outPut = new File(outPath.toString());
+            ImageIO.write(frameToBufferedImage(frame), "jpg", outPut);
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 创建BufferedImage对象
+     */
+    public static BufferedImage frameToBufferedImage(Frame frame) {
+        Java2DFrameConverter converter = new Java2DFrameConverter();
+        BufferedImage bufferedImage = converter.getBufferedImage(frame);
+        converter.close();
+        return bufferedImage;
+    }
+
+    public static int getFramgeByTime(FFmpegFrameGrabber grabber, Long timestamp) throws Exception {
+        grabber.setTimestamp(timestamp, true);
+        Frame frame = grabber.grabFrame(false, true, true, false); // 抓取对应的帧
+        if (frame != null) {
+            return grabber.getFrameNumber();
+        } else {
+            throw new Exception("无法获取对应时间戳的帧");
+        }
+    }
+
+    public static long getTimestampByFrame(FFmpegFrameGrabber grabber, int frame) throws Exception {
+        grabber.setFrameNumber(frame);
+        return grabber.getTimestamp();
+    }
+
+    // 递归删除目录及其内容
+    private static void deleteDirectory(Path directory) throws Exception {
+        if (Files.isDirectory(directory)) {
+            // 遍历目录中的所有文件和子目录
+            try (java.util.stream.Stream<Path> stream = Files.list(directory)) {
+                stream.forEach(path -> {
+                    try {
+                        deleteDirectory(path);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                });
+            }
+        }
+        // 删除文件或空目录
+        Files.delete(directory);
+    }
+}

+ 53 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/utils/ZipUtils.java

@@ -0,0 +1,53 @@
+package com.taais.biz.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ZipUtils {
+
+    /**
+     * 压缩指定文件夹中的所有文件
+     *
+     * @param sourceFolderPath 源文件夹路径
+     * @param zipFilePath      生成的ZIP文件路径
+     * @throws IOException 如果发生I/O错误
+     */
+    public static void zipFolderFiles(String sourceFolderPath, String zipFilePath) throws IOException {
+        File sourceFolder = new File(sourceFolderPath);
+        if (!sourceFolder.exists() || !sourceFolder.isDirectory()) {
+            throw new IllegalArgumentException(
+                    "Source folder does not exist or is not a directory: " + sourceFolderPath);
+        }
+
+        try (FileOutputStream fos = new FileOutputStream(zipFilePath);
+                ZipOutputStream zos = new ZipOutputStream(fos)) {
+
+            File[] files = sourceFolder.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    if (file.isFile()) {
+                        zipFile(file, file.getName(), zos);
+                    }
+                }
+            }
+        }
+    }
+
+    private static void zipFile(File file, String fileName, ZipOutputStream zos) throws IOException {
+        try (FileInputStream fis = new FileInputStream(file)) {
+            ZipEntry zipEntry = new ZipEntry(fileName);
+            zos.putNextEntry(zipEntry);
+
+            byte[] buffer = new byte[1024];
+            int len;
+            while ((len = fis.read(buffer)) > 0) {
+                zos.write(buffer, 0, len);
+            }
+            zos.closeEntry();
+        }
+    }
+}

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

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

@@ -9,6 +9,14 @@
         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>

+ 7 - 0
taais-modules/taais-biz/src/main/resources/mapper/demo/Video2imageMapper.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.Video2imageMapper">
+
+</mapper>

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

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.taais.biz.mapper.TargetIdentificationSubtaskDetailsMapper">
+
+    <select id="getTargetIdentificationSubtaskDetailsListBySubtaskId"
+            resultType="com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo">
+        select * from target_identification_subtask_details where subtask_id = #{subtaskId}
+    </select>
+</mapper>

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

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.taais.biz.mapper.TargetIdentificationSubtaskMapper">
+
+    <select id="getAvailableSubtask" resultType="com.taais.biz.domain.TargetIdentificationSubtask">
+        SELECT
+            *
+        FROM
+            target_identification_subtask t
+        WHERE
+            t.status = '0' and t.task_id = #{taskId}
+        ORDER BY
+            t.create_time DESC
+        LIMIT 1
+    </select>
+</mapper>

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

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.taais.biz.mapper.TargetIdentificationTaskMapper">
+
+    <select id="getAvailableTask" resultType="com.taais.biz.domain.TargetIdentificationTask">
+        SELECT
+            *
+        FROM
+            target_identification_task t
+        WHERE
+            t.status = '0'
+        ORDER BY
+            t.create_time DESC
+        LIMIT 1
+    </select>
+</mapper>

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

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