Explorar o código

Merge remote-tracking branch 'origin/dev_allen_craeteTask' into dev_lsk_taskconfig

# Conflicts:
#	script/sql/postgresql/data(postgresql).sql
#	taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java
#	taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/DataMapper.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
#	taais-modules/taais-biz/src/main/resources/mapper/biz/DataMapper.xml
Suuuuuukang hai 11 meses
pai
achega
26c00f5de5
Modificáronse 42 ficheiros con 2655 adicións e 64 borrados
  1. 293 0
      script/sql/postgresql/data(postgresql).sql
  2. BIN=BIN
      script/sql/postgresql/taais20240815-2.sql
  3. BIN=BIN
      script/sql/postgresql/taais2024811.sql
  4. 3 21
      taais-admin/src/main/resources/application-dev.yml
  5. 17 6
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/DataController.java
  6. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskController.java
  7. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskDetailsController.java
  8. 120 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationTaskController.java
  9. 46 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtask.java
  10. 78 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationSubtaskDetails.java
  11. 43 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/TargetIdentificationTask.java
  12. 16 16
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/DataBo.java
  13. 48 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskBo.java
  14. 109 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationSubtaskDetailsBo.java
  15. 44 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/TargetIdentificationTaskBo.java
  16. 40 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/dto/task/CreateTargetIdentificationTaskDto.java
  17. 9 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/DataSelectVo.java
  18. 85 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsImportVo.java
  19. 95 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsVo.java
  20. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskImportVo.java
  21. 53 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskVo.java
  22. 42 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskImportVo.java
  23. 50 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationTaskVo.java
  24. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskDetailsImportListener.java
  25. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationSubtaskImportListener.java
  26. 119 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/listener/TargetIdentificationTaskImportListener.java
  27. 4 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/DataMapper.java
  28. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.java
  29. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskMapper.java
  30. 16 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationTaskMapper.java
  31. 11 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/IDataService.java
  32. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskDetailsService.java
  33. 66 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationSubtaskService.java
  34. 68 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/ITargetIdentificationTaskService.java
  35. 64 21
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/DataServiceImpl.java
  36. 149 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskDetailsServiceImpl.java
  37. 129 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationSubtaskServiceImpl.java
  38. 215 0
      taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java
  39. 6 0
      taais-modules/taais-biz/src/main/resources/mapper/biz/DataMapper.xml
  40. 7 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskDetailsMapper.xml
  41. 7 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationSubtaskMapper.xml
  42. 7 0
      taais-modules/taais-biz/src/main/resources/mapper/identification/TargetIdentificationTaskMapper.xml

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

@@ -811,3 +811,296 @@ values(2024082310223604, '算法任务删除', 2024082310223600, '4',  '', '', 1
 
 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=BIN
script/sql/postgresql/taais20240815-2.sql


BIN=BIN
script/sql/postgresql/taais2024811.sql


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

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

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

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

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

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

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

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

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

@@ -0,0 +1,120 @@
+package com.taais.biz.controller;
+
+import java.util.List;
+
+import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.apache.commons.lang3.StringUtils;
+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();
+    }
+
+    public CommonResult<String> createTask(CreateTargetIdentificationTaskDto taskDto) {
+        String errorMsg = targetIdentificationTaskService.createTask(taskDto);
+        if (StringUtils.isNotEmpty(errorMsg)) {
+            return CommonResult.fail(errorMsg);
+        } else {
+            return CommonResult.success();
+        }
+    }
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 119 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/listener/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;
+            }
+        };
+    }
+}

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

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

+ 16 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/mapper/TargetIdentificationSubtaskDetailsMapper.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.TargetIdentificationSubtaskDetails;
+
+/**
+ * 目标识别子任务Mapper接口
+ *
+ * @author 0
+ * 2024-08-17
+ */
+@Mapper
+public interface TargetIdentificationSubtaskDetailsMapper extends BaseMapper<TargetIdentificationSubtaskDetails> {
+
+}

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

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

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

@@ -1,9 +1,12 @@
 package com.taais.biz.service;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import com.taais.biz.domain.Data;
 import com.taais.biz.domain.vo.BatchDataResult;
+import com.taais.biz.domain.vo.DataSelectVo;
 import com.taais.biz.domain.vo.DataVo;
 import com.taais.biz.domain.bo.DataBo;
 import com.taais.common.core.core.domain.CommonResult;
@@ -83,4 +86,12 @@ public interface IDataService extends IBaseService<Data> {
     boolean deleteByIds(Long[] ids);
 
     List<Data> selectByIds(List<Long> ids);
+
+    /**
+     * 根据传入字段 获取数据库中所有该字段的类型
+     *
+     * @param field 字段
+     * @return {@link List }<{@link String }>
+     */
+    List<DataSelectVo>  getFormSelects(String field);
 }

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

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

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

@@ -0,0 +1,66 @@
+package com.taais.biz.service;
+
+import java.util.List;
+
+import com.taais.biz.domain.TargetIdentificationSubtask;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskVo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+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);
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @param targetIdentificationSubtaskBo 目标识别子任务Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(TargetIdentificationSubtaskBo targetIdentificationSubtaskBo);
+
+    /**
+     * 批量删除目标识别子任务
+     *
+     * @param ids 需要删除的目标识别子任务主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+}

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

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

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

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

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

@@ -0,0 +1,149 @@
+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;
+
+    @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.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);
+
+        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));
+    }
+
+}

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

@@ -0,0 +1,129 @@
+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.TargetIdentificationSubtaskMapper;
+import com.taais.biz.domain.TargetIdentificationSubtask;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+import com.taais.biz.domain.vo.TargetIdentificationSubtaskVo;
+import com.taais.biz.service.ITargetIdentificationSubtaskService;
+import static com.taais.biz.domain.table.TargetIdentificationSubtaskTableDef.TARGET_IDENTIFICATION_SUBTASK;
+
+/**
+ * 目标识别子任务Service业务层处理
+ *
+ * @author Allen
+ * 2024-08-17
+ */
+@Service
+public class TargetIdentificationSubtaskServiceImpl extends BaseServiceImpl<TargetIdentificationSubtaskMapper, TargetIdentificationSubtask> implements ITargetIdentificationSubtaskService {
+    @Resource
+    private TargetIdentificationSubtaskMapper targetIdentificationSubtaskMapper;
+
+    @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()));
+        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值
+    }
+
+    /**
+     * 修改目标识别子任务
+     *
+     * @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));
+    }
+
+}

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

@@ -0,0 +1,215 @@
+package com.taais.biz.service.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
+import com.taais.biz.domain.dto.task.TaskDto;
+import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
+import com.taais.biz.service.ITargetIdentificationSubtaskService;
+import com.taais.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.TargetIdentificationTaskMapper;
+import com.taais.biz.domain.TargetIdentificationTask;
+import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
+import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
+import com.taais.biz.service.ITargetIdentificationTaskService;
+import static com.taais.biz.domain.table.TargetIdentificationTaskTableDef.TARGET_IDENTIFICATION_TASK;
+
+/**
+ * 目标识别任务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;
+
+    @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);
+
+        return this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 修改目标识别任务
+     *
+     * @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
+    @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);
+        // todo 确保保存后有id
+        this.insert(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 createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+        List<TaskDto> algTaskList = taskDto.getAlgTaskList();
+        List<String> testBatchNumList = taskDto.getTestBatchNumList();
+        TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
+        subtask.setName("测试");
+        subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
+        subtask.setTaskId(taskId);
+        // todo set others params
+
+        // todo 保证有主键id
+
+        subtaskService.insert(subtask);
+
+        for (TaskDto algTask : algTaskList) {
+            // 通过算法id 获取算法配置
+            Long algorithmId = algTask.getAlgorithmId();
+            // todo
+            String algUrl = "";
+            String algName = "";
+            // algConfig = xxxService.getById(algorithmId)
+            // alg algUrl = algConfig.getTestUrl()
+            // alg algName = algConfig.getName()
+
+            for (String batchNum : testBatchNumList) {
+                createSubTaskDetails(subtask, algUrl,algName, algTask, testBatchNumList);
+            }
+        }
+    }
+
+    private void createSubTaskDetails(TargetIdentificationSubtaskBo subtask, String algUrl, String algName, TaskDto algTask, List<String> testBatchNumList) {
+        //
+        TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
+        // 通过算法id获取算法配置
+        subtaskDetail.setName(algName);
+        subtaskDetailsService.insert(subtaskDetail);
+    }
+
+    private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
+
+    }
+
+    // todo 检查数据是否有问题
+    private String checkTask(CreateTargetIdentificationTaskDto taskDto) {
+        return null;
+    }
+
+}

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

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

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

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

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