Pārlūkot izejas kodu

Merge branch 'dev_lsk_feature_objtrack' of www/taais into develop

Sk18834839360 6 mēneši atpakaļ
vecāks
revīzija
a2f6ca11b4

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

@@ -1104,3 +1104,86 @@ values(2024081714395204, '目标识别子任务删除', 2024081714395200, '4',
 
 insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
 values(2024081714395205, '目标识别子任务导出', 2024081714395200, '5',  '', '', 1, 0, 'F', '0', '0', 'identification:identificationSubtask:export',       '', 1, now(), 1, null, '');
+
+CREATE TABLE "public"."object_trace_merge" (
+                                                                  "id" "pg_catalog"."int8" NOT NULL,
+                                                                  "name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
+                                                                  "status" "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",
+                                                                  "start_time" "pg_catalog"."timestamp",
+                                                                  "end_time" "pg_catalog"."timestamp",
+                                                                  "cost_second" "pg_catalog"."int8",
+                                                                  "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"."object_trace_merge"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."object_trace_merge"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."parameters" IS '调用算法时所用的参数';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."preprocess_path" IS '预处理数据路径';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."result_path" IS '结果数据路径';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."start_time" IS '开始时间';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."end_time" IS '结束时间';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."cost_second" IS '耗时';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."object_trace_merge"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON TABLE "public"."object_trace_merge" IS '多物体融合轨迹识别';
+
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, order_num, path, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values(4, '多目标选择', '1', 'multiObj', 1, 0, 'M', '0', '0', 'demo:traceMerge:list', '', 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(2024101614471100, '多物体融合轨迹识别', 4, '1', '/demo/traceMerge', 'demo/traceMerge/index', 1, 0, 'C', '0', '0', 'demo:traceMerge: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(2024101614471101, '多物体融合轨迹识别查询', 2024101614471100, '1',  '', '', 1, 0, 'F', '0', '0', 'demo:traceMerge: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(2024101614471102, '多物体融合轨迹识别新增', 2024101614471100, '2',  '', '', 1, 0, 'F', '0', '0', 'demo:traceMerge: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(2024101614471103, '多物体融合轨迹识别修改', 2024101614471100, '3',  '', '', 1, 0, 'F', '0', '0', 'demo:traceMerge: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(2024101614471104, '多物体融合轨迹识别删除', 2024101614471100, '4',  '', '', 1, 0, 'F', '0', '0', 'demo:traceMerge: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(2024101614471105, '多物体融合轨迹识别导出', 2024101614471100, '5',  '', '', 1, 0, 'F', '0', '0', 'demo:traceMerge:export',       '', 1, now(), 1, null, '');

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

@@ -37,7 +37,9 @@ public class MimeTypeUtils {
         // pdf
         "pdf",
         // pt
-        "pt"
+        "pt",
+        // mat
+        "mat"
     };
 
     public static String getExtension(String prefix) {

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

@@ -106,9 +106,15 @@ public class BizConstant {
     public static final String R_CURVE = "R_curve.png";
     public static final String P_CURVE = "P_curve.png";
     public static final String F1_CURVE = "F1_curve.png";
-    public static final String ORIGINAL_IMAGE = "原始图片";
-    public static final String DOCKER_BASE_PATH = "/home/ObjectDetection_Web";
-    public static final String DOCKER_PT_PATH = "weights/best.pt";
+    public static final String ORIGINAL_IMAGE= "原始图片";
+    public static final String DOCKER_BASE_PATH= "/home/ObjectDetection_Web";
+//    public static final String DOCKER_BASE_PATH= "ObjectDetection_Web";
+    public static final String DOCKER_PT_PATH= "weights/best.pt";
 
     public static final String REMARK_PREFIX = "__URL__";
+
+    public static final String TYPE_OBJ_TRACE = "OBJ_TRACE";
+    public static final String DOCKER_MAT_TASK = DOCKER_BASE_PATH + "/obj_track";
+    public static final String MULTI_OBJ_TRACE_URL = "127.0.0.1:10027/objTrace";
+
 }

+ 207 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/ObjectTraceMergeController.java

@@ -0,0 +1,207 @@
+package com.taais.biz.controller;
+
+import java.io.File;
+import java.util.*;
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.taais.biz.constant.BizConstant;
+import com.taais.biz.domain.ObjectTraceMerge;
+import com.taais.biz.domain.bo.ObjectTraceMergeBo;
+import com.taais.biz.domain.vo.ObjectTraceMergeVo;
+import com.taais.biz.service.IObjectTraceMergeService;
+import com.taais.biz.service.impl.ObjectTraceMergeServiceImpl;
+import com.taais.common.core.utils.MapstructUtils;
+import com.taais.common.core.utils.uuid.UUID;
+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.common.core.core.page.PageResult;
+
+import static com.taais.biz.constant.BizConstant.*;
+
+/**
+ * 多物体融合轨迹识别Controller
+ *
+ * @author km
+ * 2024-10-16
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/demo/traceMerge")
+public class ObjectTraceMergeController extends BaseController {
+    @Resource
+    private ObjectTraceMergeServiceImpl objectTraceMergeService;
+
+    /**
+     * 查询多物体融合轨迹识别列表
+     */
+    @SaCheckPermission("demo:traceMerge:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<ObjectTraceMergeVo>> list(ObjectTraceMergeBo objectTraceMergeBo) {
+        return CommonResult.success(objectTraceMergeService.selectPage(objectTraceMergeBo));
+    }
+
+    /**
+     * 导出多物体融合轨迹识别列表
+     */
+    @SaCheckPermission("demo:traceMerge:export")
+    @Log(title = "多物体融合轨迹识别", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ObjectTraceMergeBo objectTraceMergeBo) {
+        List<ObjectTraceMergeVo> list = objectTraceMergeService.selectList(objectTraceMergeBo);
+        ExcelUtil.exportExcel(list, "多物体融合轨迹识别", ObjectTraceMergeVo.class, response);
+    }
+
+    /**
+     * 获取多物体融合轨迹识别详细信息
+     */
+    @SaCheckPermission("demo:traceMerge:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<ObjectTraceMergeVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(objectTraceMergeService.selectById(id));
+    }
+
+
+    /**
+     * 新增多物体融合轨迹识别
+     */
+    @SaCheckPermission("demo:traceMerge:add")
+    @Log(title = "多物体融合轨迹识别", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody ObjectTraceMergeBo objectTraceMergeBo) {
+        String uuid = UUID.randomUUID().toString();
+        String resultPath = DOCKER_MAT_TASK + "/" + uuid;
+        objectTraceMergeBo.setResultPath(resultPath);
+        objectTraceMergeBo.setStatus(TASK_STATUS_PENDING);
+        objectTraceMergeBo.setPreprocessPath(objectTraceMergeBo.getPreprocessPath().replace("/profile", DOCKER_BASE_PATH));
+        boolean inserted = objectTraceMergeService.insert(objectTraceMergeBo);
+        if (!inserted) {
+            return CommonResult.fail("新增多物体融合轨迹识别记录失败!");
+        }
+        // 创建结果路径
+        try {
+            File dir = new File(resultPath);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+        } catch (Exception e) {
+            return CommonResult.fail("创建结果路径失败!");
+        }
+
+        return CommonResult.success();
+    }
+
+    @PostMapping("/execute")
+    public CommonResult<Void> execute(@RequestBody Map<String, String> _params) {
+        if (!_params.containsKey("taskId")) {
+            return CommonResult.fail("请提供任务ID!");
+        }
+        String taskId = _params.get("taskId");
+        ObjectTraceMergeBo vo = objectTraceMergeService.getById(Long.valueOf(taskId));
+        if (vo == null) {
+            return CommonResult.fail("未找到任务内容!");
+        }
+        if (TASK_STATUS_SUCCEED.equals(vo.getStatus())) {
+            return CommonResult.fail("任务已经执行完毕!");
+        }
+        if (!(TASK_STATUS_PENDING.equals(vo.getStatus()) || TASK_STATUS_FAILED.equals(vo.getStatus()))) {
+            return CommonResult.fail("任务正在执行中!");
+        }
+        vo.setStartTime(new Date());
+
+        Map<String, String> params = new HashMap<>();
+        params.put("bizType", TYPE_OBJ_TRACE);
+        params.put("bizId", String.valueOf(vo.getId()));
+        params.put("logPath", vo.getResultPath());
+        params.put("sourcePath", vo.getPreprocessPath());
+        params.put("resultPath", vo.getResultPath());
+        params.put("otherParams", new JSONObject().toString());
+
+        try {
+            String res = HttpUtil.post(MULTI_OBJ_TRACE_URL, JSONUtil.toJsonStr(params));
+            vo.setStatus(TASK_STATUS_PROCESSING);
+        } catch (Exception e) {
+            vo.setStatus(TASK_STATUS_FAILED);
+            return CommonResult.fail("HTTP请求失败" + e.getMessage());
+        } finally {
+            objectTraceMergeService.update(vo);
+        }
+        return CommonResult.success();
+    }
+
+    @GetMapping("/result")
+    public CommonResult<List<String>> execute(String taskId) {
+        if (taskId == null) {
+            return CommonResult.fail("请提供任务ID!", new ArrayList<>());
+        }
+        ObjectTraceMergeBo bo = objectTraceMergeService.getById(Long.valueOf(taskId));
+        if (bo == null) {
+            return CommonResult.fail("无法查找到任务!", new ArrayList<>());
+        }
+//        if (!TASK_STATUS_SUCCEED.equals(bo.getStatus())) {
+//            return CommonResult.fail("任务未成功执行!", new ArrayList<>());
+//        }
+        try {
+            String res = bo.getResultPath();
+            File dir = new File(res);
+            File[] files = dir.listFiles();
+            List<String> resList = new ArrayList<>();
+            int maxNum = -1;
+            for (File _file: files) {
+                if (_file.getName().contains("number")) {
+                    maxNum = Math.max(maxNum, Integer.parseInt(_file.getName()
+                        .replace("number", "")
+                        .replace(".png", "")
+                    ));
+                }
+            }
+            resList.add(String.valueOf(maxNum));
+            return CommonResult.success(resList);
+        } catch (Exception e) {
+            return CommonResult.fail("查找结果失败!", new ArrayList<>());
+        }
+    }
+
+    /**
+     * 修改多物体融合轨迹识别
+     */
+    @SaCheckPermission("demo:traceMerge:edit")
+    @Log(title = "多物体融合轨迹识别", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody ObjectTraceMergeBo objectTraceMergeBo) {
+        Boolean updated = objectTraceMergeService.update(objectTraceMergeBo);
+        if (!updated) {
+            return CommonResult.fail("修改多物体融合轨迹识别记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除多物体融合轨迹识别
+     */
+    @SaCheckPermission("demo:traceMerge:remove")
+    @Log(title = "多物体融合轨迹识别", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = objectTraceMergeService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除多物体融合轨迹识别记录失败!");
+        }
+        return CommonResult.success();
+    }
+}

+ 24 - 9
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/PublicController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
 import com.taais.biz.constant.BizConstant;
 import com.taais.biz.domain.TaskTrackResultBo;
 import com.taais.biz.domain.bo.AlgorithmModelBo;
+import com.taais.biz.domain.bo.ObjectTraceMergeBo;
 import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
 import com.taais.biz.domain.bo.ToInfraredBo;
 import com.taais.biz.domain.bo.ToInfraredStartResultBo;
@@ -11,6 +12,7 @@ import com.taais.biz.domain.bo.VideoStableStartResultBo;
 import com.taais.biz.domain.dto.TaskResultDTO;
 import com.taais.biz.service.*;
 import com.taais.biz.service.impl.AlgorithmModelServiceImpl;
+import com.taais.biz.service.impl.ObjectTraceMergeServiceImpl;
 import com.taais.biz.service.impl.TargetIdentificationSubtaskDetailsServiceImpl;
 import com.taais.common.core.core.domain.CommonResult;
 import com.taais.common.log.annotation.Log;
@@ -64,6 +66,9 @@ public class PublicController extends BaseController {
     @Resource
     AlgorithmModelServiceImpl algorithmModelService;
 
+    @Resource
+    ObjectTraceMergeServiceImpl objectTraceMergeService;
+
 
 
     // todo: 2024080906
@@ -76,14 +81,15 @@ public class PublicController extends BaseController {
             return CommonResult.fail(errorMsg);
         }
         String bizType = resultDTO.getBizType();
-        if (BizConstant.TYPE_DATA_BIZ_PROCESS.equals(bizType)) {
-            // errorMsg = bizProcessService.taskResult(resultDTO);
+
+        if(BizConstant.TYPE_DATA_BIZ_PROCESS.equals(bizType)){
+            //errorMsg = bizProcessService.taskResult(resultDTO);
             TargetIdentificationSubtaskDetailsBo detailsBo = detailsService.getById(resultDTO.getBizId());
             detailsBo.setStatus(resultDTO.getStatus() != 200 ? BizConstant.TASK_STATUS_FAILED :
                 resultDTO.getMsg().contains("finish") ? BizConstant.TASK_STATUS_SUCCEED : BizConstant.TASK_STATUS_PROCESSING);
             detailsBo.setRemarks(JSON.toJSONString(Arrays.asList(resultDTO.getMin(), resultDTO.getMax(), resultDTO.getAverage())));
             detailsBo.setEndTime(new Date());
-            detailsBo.setCostSecond(detailsBo.getEndTime().getTime() - detailsBo.getStartTime().getTime());
+            detailsBo.setCostSecond((detailsBo.getEndTime().getTime() - detailsBo.getStartTime().getTime()) / 1000);
             detailsService.update(detailsBo);
 
             // 保存模型
@@ -95,14 +101,23 @@ public class PublicController extends BaseController {
                 bo.setModelName(detailsBo.getName() + "_" + detailsBo.getCreateTime().toString());
                 algorithmModelService.insert(bo);
             }
+        } else if (BizConstant.TYPE_OBJ_TRACE.equals(bizType)){
+            ObjectTraceMergeBo bo = objectTraceMergeService.getById(resultDTO.getBizId());
+            if (bo == null) {
+                return CommonResult.fail("bo为null");
+            }
+            bo.setEndTime(new Date());
+            bo.setCostSecond((bo.getEndTime().getTime() - bo.getStartTime().getTime()) / 1000);
+            bo.setStatus(resultDTO.getStatus() == 200 ? BizConstant.TASK_STATUS_SUCCEED : BizConstant.TASK_STATUS_FAILED);
+            objectTraceMergeService.update(bo);
         } else if (BizConstant.TYPE_DATA_PROCESS.equals(bizType)) {
             errorMsg = dataProcessService.taskResult(resultDTO);
         } else {
-            log.error("这种情况是不可能发生的,参数:{}", resultDTO);
+            log.error("这种情况是不可能发生的,参数:{}",resultDTO);
             return CommonResult.fail("这种情况是不可能发生的");
         }
 
-        if (StringUtils.isNotEmpty(errorMsg)) {
+        if(StringUtils.isNotEmpty(errorMsg)){
             return CommonResult.fail(errorMsg);
         }
         return CommonResult.success();
@@ -110,16 +125,16 @@ public class PublicController extends BaseController {
 
     private String checkDTO(TaskResultDTO resultDTO) {
         Integer status = resultDTO.getStatus();
-        if (status != 200 && status != 500) {
+        if(status != 200 && status != 500){
             return "status 只能是200或500";
         }
         Long bizId = resultDTO.getBizId();
-        if (bizId == null) {
+        if(bizId == null){
             return "bizId 不能为null";
         }
         String bizType = resultDTO.getBizType();
-        if (!BizConstant.TYPE_DATA_BIZ_PROCESS.equals(bizType) && !BizConstant.TYPE_DATA_PROCESS.equals(bizType)) {
-            return "status 只能是" + BizConstant.TYPE_DATA_BIZ_PROCESS + "或" + BizConstant.TYPE_DATA_PROCESS;
+        if(!BizConstant.TYPE_OBJ_TRACE.equals(bizType) && !BizConstant.TYPE_DATA_BIZ_PROCESS.equals(bizType) && !BizConstant.TYPE_DATA_PROCESS.equals(bizType)){
+            return "status 只能是"+BizConstant.TYPE_DATA_BIZ_PROCESS+"或"+BizConstant.TYPE_DATA_PROCESS;
         }
         return null;
     }

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

@@ -0,0 +1,64 @@
+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;
+
+/**
+ * 多物体融合轨迹识别对象 object_trace_merge
+ *
+ * @author km
+ * 2024-10-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "object_trace_merge")
+public class ObjectTraceMerge extends BaseEntity
+    {
+@Serial
+private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    @Id
+    private Long id;
+
+    /** 任务名称 */
+    private String name;
+
+    /** 任务状态 */
+    private String status;
+
+    /** 调用算法时所用的参数 */
+    private String parameters;
+
+    /** 预处理数据路径 */
+    private String preprocessPath;
+
+    /** 结果数据路径 */
+    private String resultPath;
+
+    /** 开始时间 */
+    private Date startTime;
+
+    /** 结束时间 */
+    private Date endTime;
+
+    /** 耗时 */
+    private Long costSecond;
+
+    /** 备注 */
+    private String remarks;
+
+    /** 逻辑删除标志(0代表存在 1代表删除) */
+    @Column(isLogicDelete = true)
+    private Integer delFlag;
+
+
+}

+ 77 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/bo/ObjectTraceMergeBo.java

@@ -0,0 +1,77 @@
+package com.taais.biz.domain.bo;
+
+import com.taais.biz.domain.ObjectTraceMerge;
+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;
+
+/**
+ * 多物体融合轨迹识别业务对象 object_trace_merge
+ *
+ * @author km
+ * @date 2024-10-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ObjectTraceMerge.class, reverseConvertGenerate = false)
+public class ObjectTraceMergeBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank(message = "任务名称不能为空")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    private String status;
+
+    /**
+     * 调用算法时所用的参数
+     */
+    private String parameters;
+
+    /**
+     * 预处理数据路径
+     */
+    @NotBlank(message = "预处理数据路径不能为空")
+    private String preprocessPath;
+
+    /**
+     * 结果数据路径
+     */
+    private String resultPath;
+
+    /**
+     * 开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+    /**
+     * 耗时
+     */
+    private Long costSecond;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+
+}

+ 70 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/ObjectTraceMergeImportVo.java

@@ -0,0 +1,70 @@
+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;
+
+/**
+ * 多物体融合轨迹识别导入视图对象 object_trace_merge
+ *
+ * @author km
+ * @date 2024-10-16
+ */
+
+@Data
+@NoArgsConstructor
+public class ObjectTraceMergeImportVo implements Serializable
+{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+     /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String name;
+
+     /** 任务状态 */
+    @ExcelProperty(value = "任务状态")
+    private String status;
+
+     /** 调用算法时所用的参数 */
+    @ExcelProperty(value = "调用算法时所用的参数")
+    private String parameters;
+
+     /** 预处理数据路径 */
+    @ExcelProperty(value = "预处理数据路径")
+    private String preprocessPath;
+
+     /** 结果数据路径 */
+    @ExcelProperty(value = "结果数据路径")
+    private String resultPath;
+
+     /** 开始时间 */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+     /** 结束时间 */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+     /** 耗时 */
+    @ExcelProperty(value = "耗时")
+    private Long costSecond;
+
+     /** 备注 */
+    @ExcelProperty(value = "备注")
+    private String remarks;
+
+     /** 逻辑删除标志(0代表存在 1代表删除) */
+    @ExcelProperty(value = "逻辑删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+
+}

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

@@ -0,0 +1,78 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.biz.domain.ObjectTraceMerge;
+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;
+
+/**
+ * 多物体融合轨迹识别视图对象 object_trace_merge
+ *
+ * @author km
+ * @date 2024-10-16
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ObjectTraceMerge.class)
+public class ObjectTraceMergeVo 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 parameters;
+
+    /** 预处理数据路径 */
+    @ExcelProperty(value = "预处理数据路径")
+    private String preprocessPath;
+
+    /** 结果数据路径 */
+    @ExcelProperty(value = "结果数据路径")
+    private String resultPath;
+
+    /** 开始时间 */
+    @ExcelProperty(value = "开始时间")
+    private Date startTime;
+
+    /** 结束时间 */
+    @ExcelProperty(value = "结束时间")
+    private Date endTime;
+
+    /** 耗时 */
+    @ExcelProperty(value = "耗时")
+    private Long costSecond;
+
+    /** 备注 */
+    @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/ObjectTraceMergeImportListener.java

@@ -0,0 +1,119 @@
+package com.taais.biz.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.taais.biz.domain.bo.ObjectTraceMergeBo;
+import com.taais.biz.domain.vo.ObjectTraceMergeImportVo;
+import com.taais.biz.domain.vo.ObjectTraceMergeVo;
+import com.taais.biz.service.IObjectTraceMergeService;
+import com.taais.common.core.exception.ServiceException;
+import com.taais.common.core.utils.SpringUtils;
+import com.taais.common.core.utils.ValidatorUtils;
+import com.taais.common.excel.core.ExcelListener;
+import com.taais.common.excel.core.ExcelResult;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 多物体融合轨迹识别自定义导入
+ *
+ * @author km
+ */
+@Slf4j
+public class ObjectTraceMergeImportListener extends AnalysisEventListener<ObjectTraceMergeImportVo> implements ExcelListener<ObjectTraceMergeImportVo> {
+    private final IObjectTraceMergeService objectTraceMergeService;
+
+    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 ObjectTraceMergeImportListener(Boolean isUpdateSupport) {
+        this.objectTraceMergeService = SpringUtils.getBean(IObjectTraceMergeService.class);
+        this.isUpdateSupport = isUpdateSupport;
+    }
+
+    @Override
+    public void invoke(ObjectTraceMergeImportVo objectTraceMergeVo, AnalysisContext context) {
+        try {
+
+            ObjectTraceMergeBo objectTraceMergeBo = BeanUtil.toBean(objectTraceMergeVo, ObjectTraceMergeBo.class);
+
+            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
+            ObjectTraceMergeVo objectTraceMergeVo1 = null;
+
+            //objectTraceMergeVo1 = objectTraceMergeService.selectBySomefield(objectTraceMergeVo.getSomefield());
+            if (ObjectUtil.isNull(objectTraceMergeVo1)) {
+                //不存在就新增
+                objectTraceMergeBo.setVersion(0);
+                ValidatorUtils.validate(objectTraceMergeBo);
+                boolean inserted = objectTraceMergeService.insert(objectTraceMergeBo);
+
+                if (inserted) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、多物体融合轨迹识别 记录导入成功");
+                    return;
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、多物体融合轨迹识别 记录导入失败");
+                    return;
+                }
+            } else if (isUpdateSupport) {
+                //存在就更新
+                objectTraceMergeBo.setId(objectTraceMergeVo1.getId());//主键
+                objectTraceMergeBo.setVersion(objectTraceMergeVo1.getVersion());
+                boolean updated = objectTraceMergeService.update(objectTraceMergeBo);
+                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<ObjectTraceMergeImportVo> 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<ObjectTraceMergeImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

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

@@ -0,0 +1,16 @@
+package com.taais.biz.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.ObjectTraceMerge;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 多物体融合轨迹识别Mapper接口
+ *
+ * @author km
+ * 2024-10-16
+ */
+@Mapper
+public interface ObjectTraceMergeMapper extends BaseMapper<ObjectTraceMerge> {
+
+}

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

@@ -0,0 +1,66 @@
+package com.taais.biz.service;
+
+import java.util.List;
+
+import com.taais.biz.domain.ObjectTraceMerge;
+import com.taais.biz.domain.bo.ObjectTraceMergeBo;
+import com.taais.biz.domain.vo.ObjectTraceMergeVo;
+import com.taais.common.orm.core.service.IBaseService;
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 多物体融合轨迹识别Service接口
+ *
+ * @author km
+ * 2024-10-16
+ */
+public interface IObjectTraceMergeService extends IBaseService<ObjectTraceMerge> {
+    /**
+     * 查询多物体融合轨迹识别
+     *
+     * @param id 多物体融合轨迹识别主键
+     * @return 多物体融合轨迹识别
+     */
+        ObjectTraceMergeVo selectById(Long id);
+
+    /**
+     * 查询多物体融合轨迹识别列表
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 多物体融合轨迹识别集合
+     */
+    List<ObjectTraceMergeVo> selectList(ObjectTraceMergeBo objectTraceMergeBo);
+
+    /**
+     * 分页查询多物体融合轨迹识别列表
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 分页多物体融合轨迹识别集合
+     */
+    PageResult<ObjectTraceMergeVo> selectPage(ObjectTraceMergeBo objectTraceMergeBo);
+
+    /**
+     * 新增多物体融合轨迹识别
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(ObjectTraceMergeBo objectTraceMergeBo);
+
+    /**
+     * 修改多物体融合轨迹识别
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(ObjectTraceMergeBo objectTraceMergeBo);
+
+    /**
+     * 批量删除多物体融合轨迹识别
+     *
+     * @param ids 需要删除的多物体融合轨迹识别主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+}

+ 148 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/ObjectTraceMergeServiceImpl.java

@@ -0,0 +1,148 @@
+package com.taais.biz.service.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.taais.biz.domain.ObjectTraceMerge;
+import com.taais.biz.domain.bo.ObjectTraceMergeBo;
+import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
+import com.taais.biz.domain.vo.ObjectTraceMergeVo;
+import com.taais.biz.mapper.ObjectTraceMergeMapper;
+import com.taais.biz.service.IObjectTraceMergeService;
+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 static com.taais.biz.domain.table.ObjectTraceMergeTableDef.OBJECT_TRACE_MERGE;
+import static com.taais.biz.domain.table.TargetIdentificationSubtaskDetailsTableDef.TARGET_IDENTIFICATION_SUBTASK_DETAILS;
+
+/**
+ * 多物体融合轨迹识别Service业务层处理
+ *
+ * @author km
+ * 2024-10-16
+ */
+@Service
+public class ObjectTraceMergeServiceImpl extends BaseServiceImpl<ObjectTraceMergeMapper, ObjectTraceMerge> implements IObjectTraceMergeService {
+    @Resource
+    private ObjectTraceMergeMapper objectTraceMergeMapper;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(OBJECT_TRACE_MERGE);
+    }
+
+    private QueryWrapper buildQueryWrapper(ObjectTraceMergeBo objectTraceMergeBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(OBJECT_TRACE_MERGE.NAME.like
+        (objectTraceMergeBo.getName()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.STATUS.eq
+        (objectTraceMergeBo.getStatus()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.PARAMETERS.eq
+        (objectTraceMergeBo.getParameters()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.PREPROCESS_PATH.eq
+        (objectTraceMergeBo.getPreprocessPath()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.RESULT_PATH.eq
+        (objectTraceMergeBo.getResultPath()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.START_TIME.eq
+        (objectTraceMergeBo.getStartTime()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.END_TIME.eq
+        (objectTraceMergeBo.getEndTime()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.COST_SECOND.eq
+        (objectTraceMergeBo.getCostSecond()));
+        queryWrapper.and(OBJECT_TRACE_MERGE.REMARKS.eq
+        (objectTraceMergeBo.getRemarks()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询多物体融合轨迹识别
+     *
+     * @param id 多物体融合轨迹识别主键
+     * @return 多物体融合轨迹识别
+     */
+    @Override
+    public ObjectTraceMergeVo selectById(Long id) {
+        return this.getOneAs(query().where(OBJECT_TRACE_MERGE.ID.eq(id)), ObjectTraceMergeVo.class);
+    }
+
+    public ObjectTraceMergeBo getById(Long id) {
+        return this.getOneAs(query().where(OBJECT_TRACE_MERGE.ID.eq(id)), ObjectTraceMergeBo.class);
+    }
+
+    /**
+     * 查询多物体融合轨迹识别列表
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 多物体融合轨迹识别集合
+     */
+    @Override
+    public List<ObjectTraceMergeVo> selectList(ObjectTraceMergeBo objectTraceMergeBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(objectTraceMergeBo);
+            return this.listAs(queryWrapper, ObjectTraceMergeVo.class);
+    }
+
+    /**
+     * 分页查询多物体融合轨迹识别列表
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 分页多物体融合轨迹识别集合
+     */
+    @Override
+    public PageResult<ObjectTraceMergeVo> selectPage(ObjectTraceMergeBo objectTraceMergeBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(objectTraceMergeBo);
+            Page<ObjectTraceMergeVo> page = this.pageAs(PageQuery.build(), queryWrapper, ObjectTraceMergeVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增多物体融合轨迹识别
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(ObjectTraceMergeBo objectTraceMergeBo) {
+    ObjectTraceMerge objectTraceMerge =MapstructUtils.convert(objectTraceMergeBo, ObjectTraceMerge. class);
+
+        return this.save(objectTraceMerge);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 修改多物体融合轨迹识别
+     *
+     * @param objectTraceMergeBo 多物体融合轨迹识别Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(ObjectTraceMergeBo objectTraceMergeBo) {
+        ObjectTraceMerge objectTraceMerge =MapstructUtils.convert(objectTraceMergeBo, ObjectTraceMerge. class);
+        if (ObjectUtil.isNotNull(objectTraceMerge) && ObjectUtil.isNotNull(objectTraceMerge.getId())){
+            boolean updated = this.updateById(objectTraceMerge);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除多物体融合轨迹识别
+     *
+     * @param ids 需要删除的多物体融合轨迹识别主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

+ 3 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/service/impl/TargetIdentificationTaskServiceImpl.java

@@ -20,6 +20,7 @@ import com.taais.biz.domain.vo.AlgorithmModelVo;
 import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
 import com.taais.biz.domain.vo.DataVo;
 import com.taais.biz.service.*;
+import com.taais.common.core.config.TaaisConfig;
 import com.taais.common.core.utils.MapstructUtils;
 import com.taais.common.core.utils.StringUtils;
 import com.taais.common.core.utils.uuid.UUID;
@@ -279,8 +280,8 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
         return records;
     }
 
-    public static final String PATH_PREFIX = "/home/ObjectDetection_Web/task";
-    public static final String WORK_DIR = "/home/ObjectDetection_Web";
+    public static final String PATH_PREFIX = TaaisConfig.getProfile() + "/task";
+    public static final String WORK_DIR = TaaisConfig.getProfile();
     //public static final String PATH_PREFIX = "ObjectDetection_Web/task";
     //public static final String WORK_DIR = "ObjectDetection_Web";
     /**