Browse Source

Merge branch 'dev_lsk_objMatch' of www/taais into develop

Sk18834839360 8 months ago
parent
commit
9190df24f2

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

@@ -1187,3 +1187,86 @@ values(2024101614471104, '多源信息融合删除', 2024101614471100, '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(2024101614471105, '多源信息融合导出', 2024101614471100, '5',  '', '', 1, 0, 'F', '0', '0', 'demo:traceMerge:export',       '', 1, now(), 1, null, '');
+
+
+
+CREATE TABLE "public"."object_match" (
+                                               "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 "obj_match_pk" PRIMARY KEY ("id")
+);
+
+ALTER TABLE "public"."object_match"
+    OWNER TO "postgres";
+
+COMMENT ON COLUMN "public"."object_match"."id" IS '主键ID';
+
+COMMENT ON COLUMN "public"."object_match"."name" IS '任务名称';
+
+COMMENT ON COLUMN "public"."object_match"."status" IS '任务状态';
+
+COMMENT ON COLUMN "public"."object_match"."parameters" IS '调用算法时所用的参数';
+
+COMMENT ON COLUMN "public"."object_match"."preprocess_path" IS '预处理数据路径';
+
+COMMENT ON COLUMN "public"."object_match"."result_path" IS '结果数据路径';
+
+COMMENT ON COLUMN "public"."object_match"."start_time" IS '开始时间';
+
+COMMENT ON COLUMN "public"."object_match"."end_time" IS '结束时间';
+
+COMMENT ON COLUMN "public"."object_match"."cost_second" IS '耗时';
+
+COMMENT ON COLUMN "public"."object_match"."create_by" IS '创建人';
+
+COMMENT ON COLUMN "public"."object_match"."create_time" IS '创建时间';
+
+COMMENT ON COLUMN "public"."object_match"."update_by" IS '更新人';
+
+COMMENT ON COLUMN "public"."object_match"."update_time" IS '更新时间';
+
+COMMENT ON COLUMN "public"."object_match"."remarks" IS '备注';
+
+COMMENT ON COLUMN "public"."object_match"."version" IS '乐观锁';
+
+COMMENT ON COLUMN "public"."object_match"."tenant_id" IS '租户编码';
+
+COMMENT ON COLUMN "public"."object_match"."del_flag" IS '逻辑删除标志(0代表存在 1代表删除)';
+
+COMMENT ON TABLE "public"."object_match" 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(2024102812160200, '异源图像匹配', 4, '1', '/demo/match', 'demo/match/index', 1, 0, 'C', '0', '0', 'demo:match: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(2024102812160201, '异源图像匹配查询', 2024102812160200, '1',  '', '', 1, 0, 'F', '0', '0', 'demo:match: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(2024102812160202, '异源图像匹配新增', 2024102812160200, '2',  '', '', 1, 0, 'F', '0', '0', 'demo:match: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(2024102812160203, '异源图像匹配修改', 2024102812160200, '3',  '', '', 1, 0, 'F', '0', '0', 'demo:match: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(2024102812160204, '异源图像匹配删除', 2024102812160200, '4',  '', '', 1, 0, 'F', '0', '0', 'demo:match: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(2024102812160205, '异源图像匹配导出', 2024102812160200, '5',  '', '', 1, 0, 'F', '0', '0', 'demo:match:export',       '', 1, now(), 1, null, '');

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

@@ -109,13 +109,16 @@ public class BizConstant {
     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_BASE_PATH= "ObjectDetection_Web";
+//    public static final String DOCKER_BASE_PATH= "D:/home/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_MATCH = "OBJ_MATCH";
+
+    public static final String DOCKER_OBJ_MATCH_PATH = DOCKER_BASE_PATH + "/objectMatch";
     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";
-
+    public static final String MULTI_OBJ_MATCH_URL = "127.0.0.1:10028/imgMatch";
 }

+ 263 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/ObjectMatchController.java

@@ -0,0 +1,263 @@
+package com.taais.biz.controller;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+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.Data;
+import com.taais.biz.domain.ObjectMatch;
+import com.taais.biz.domain.bo.ObjectMatchBo;
+import com.taais.biz.domain.vo.ObjectMatchVo;
+import com.taais.biz.service.service.IObjectMatchService;
+import com.taais.biz.service.service.impl.ObjectMatchServiceImpl;
+import com.taais.common.core.config.TaaisConfig;
+import com.taais.common.core.utils.StringUtils;
+import com.taais.common.core.utils.file.FileUploadUtils;
+import com.taais.common.core.utils.file.UnPackedUtil;
+import com.taais.common.core.utils.uuid.UUID;
+import com.taais.system.domain.vo.SysOssVo;
+import com.taais.system.service.ISysOssService;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.extern.slf4j.Slf4j;
+import net.lingala.zip4j.model.FileHeader;
+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 org.springframework.web.multipart.MultipartFile;
+
+import static com.taais.biz.constant.BizConstant.*;
+
+/**
+ * 异源图像匹配Controller
+ *
+ * @author km
+ * 2024-10-28
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/demo/match")
+@Slf4j
+public class ObjectMatchController extends BaseController {
+    @Resource
+    private ObjectMatchServiceImpl objectMatchService;
+
+    @Resource
+    private ISysOssService sysOssService;
+
+    /**
+     * 查询异源图像匹配列表
+     */
+    @SaCheckPermission("demo:match:list")
+    @GetMapping("/list")
+    public CommonResult<PageResult<ObjectMatchVo>> list(ObjectMatchBo objectMatchBo) {
+        return CommonResult.success(objectMatchService.selectPage(objectMatchBo));
+    }
+
+    /**
+     * 导出异源图像匹配列表
+     */
+    @SaCheckPermission("demo:match:export")
+    @Log(title = "异源图像匹配", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ObjectMatchBo objectMatchBo) {
+        List<ObjectMatchVo> list = objectMatchService.selectList(objectMatchBo);
+        ExcelUtil.exportExcel(list, "异源图像匹配", ObjectMatchVo.class, response);
+    }
+
+    /**
+     * 获取异源图像匹配详细信息
+     */
+    @SaCheckPermission("demo:match:query")
+    @GetMapping(value = "/{id}")
+    public CommonResult<ObjectMatchVo> getInfo(@PathVariable Long id) {
+        return CommonResult.success(objectMatchService.selectById(id));
+    }
+
+    /**
+     * 新增异源图像匹配
+     */
+    @SaCheckPermission("demo:match:add")
+    @Log(title = "异源图像匹配", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public CommonResult<Void> add(@Validated @RequestBody ObjectMatchBo objectMatchBo) {
+        boolean inserted = objectMatchService.insert(objectMatchBo);
+        if (!inserted) {
+            return CommonResult.fail("新增异源图像匹配记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 修改异源图像匹配
+     */
+    @SaCheckPermission("demo:match:edit")
+    @Log(title = "异源图像匹配", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public CommonResult<Void> edit(@Validated @RequestBody ObjectMatchBo objectMatchBo) {
+        Boolean updated = objectMatchService.update(objectMatchBo);
+        if (!updated) {
+            return CommonResult.fail("修改异源图像匹配记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    /**
+     * 删除异源图像匹配
+     */
+    @SaCheckPermission("demo:match:remove")
+    @Log(title = "异源图像匹配", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public CommonResult<Void> remove(@PathVariable Long[] ids) {
+        boolean deleted = objectMatchService.deleteByIds(ids);
+        if (!deleted) {
+            return CommonResult.fail("删除异源图像匹配记录失败!");
+        }
+        return CommonResult.success();
+    }
+
+    @GetMapping("/execute")
+    public CommonResult<Void> execute(String taskId) {
+        ObjectMatchBo bo = objectMatchService.getById(Long.parseLong(taskId));
+        bo.setStartTime(new Date());
+        Map<String, String> params = new HashMap<>();
+
+        params.put("bizId", String.valueOf(bo.getId()));
+        params.put("bizType", TYPE_OBJ_MATCH);
+        params.put("logPath", bo.getResultPath() + "/log.log");
+        params.put("sourcePath", bo.getPreprocessPath());
+        params.put("resultPath", bo.getResultPath());
+        params.put("otherParams", new JSONObject().toString());
+
+        log.info("obj_match params: {}", params);
+
+        try {
+            String res = HttpUtil.post(MULTI_OBJ_MATCH_URL, JSONUtil.toJsonStr(params));
+            bo.setStatus(TASK_STATUS_PROCESSING);
+        } catch (Exception e) {
+            bo.setStatus(TASK_STATUS_FAILED);
+            bo.setEndTime(new Date());
+            bo.setCostSecond((bo.getEndTime().getTime() - bo.getStartTime().getTime()) / 1000);
+            return CommonResult.fail("HTTP请求失败" + e.getMessage());
+        } finally {
+            objectMatchService.update(bo);
+        }
+        return CommonResult.success();
+    }
+
+    @GetMapping("/result")
+    public CommonResult<List<String>> getResult(String taskId) {
+        ObjectMatchBo bo = objectMatchService.getById(Long.parseLong(taskId));
+        if (bo == null) {
+            return CommonResult.fail("未找到任务", null);
+        }
+        String path = bo.getResultPath();
+        File dir = new File(path + "/IR_VIS_obj_in_IR");
+        List<String> res = new ArrayList<>();
+        if (dir.exists()) {
+            for (File file : dir.listFiles()) {
+                res.add(file.getName());
+            }
+        }
+        return CommonResult.success(res);
+    }
+
+    @PostMapping("/createTask")
+    public CommonResult<Void> createTask(@RequestBody Map<String, String> params) throws IOException {
+        String file = params.get("file");
+        if (file == null) {
+            return CommonResult.fail("请上传.zip压缩文件。");
+        }
+        ObjectMatchBo match = new ObjectMatchBo();
+        match.setName(params.get("name"));
+        match.setParameters(params.get("parameters"));
+        match.setStatus(BizConstant.TASK_STATUS_PENDING);
+
+        String path = BizConstant.DOCKER_OBJ_MATCH_PATH + "/" + UUID.randomUUID().toString();
+        match.setPreprocessPath(path);
+
+        SysOssVo _file = sysOssService.getById(Long.parseLong(file));
+        String filePath = TaaisConfig.getProfile() + _file.getUrl().split("/profile")[1];
+        ZipFileExtractor.extractZipFile(filePath, path);
+
+        match.setResultPath(path + "/result");
+        File dir = new File(match.getResultPath());
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        boolean res = objectMatchService.insert(match);
+        return res ? CommonResult.success() : CommonResult.fail();
+    }
+
+    public static class ZipFileExtractor {
+
+        public static void extractZipFile(String zipFilePath, String destDir) throws IOException {
+            Path zipPath = Paths.get(zipFilePath);
+            Path destDirPath = Paths.get(destDir);
+
+            if (Files.notExists(destDirPath)) {
+                Files.createDirectories(destDirPath);
+            }
+
+            try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(zipPath))) {
+                ZipEntry entry = zis.getNextEntry();
+                while (entry != null) {
+                    Path extractedPath = destDirPath.resolve(entry.getName());
+
+                    if (entry.isDirectory()) {
+                        Files.createDirectories(extractedPath);
+                    } else {
+// Ensure parent directories exist
+                        if (extractedPath.getParent() != null && Files.notExists(extractedPath.getParent())) {
+                            Files.createDirectories(extractedPath.getParent());
+                        }
+
+// Write file content
+                        try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(extractedPath))) {
+                            byte[] buffer = new byte[1024];
+                            int len;
+                            while ((len = zis.read(buffer)) != -1) {
+                                bos.write(buffer, 0, len);
+                            }
+                        }
+                    }
+                    zis.closeEntry();
+                    entry = zis.getNextEntry();
+                }
+            }
+        }
+
+        public static void main(String[] args) {
+            try {
+                String zipFilePath = "path/to/your/zipfile.zip";
+                String destDir = "path/to/your/destDir";
+                extractZipFile(zipFilePath, destDir);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 15 - 7
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/PublicController.java

@@ -3,17 +3,13 @@ package com.taais.biz.controller;
 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;
-import com.taais.biz.domain.bo.VideoStableStartResultBo;
+import com.taais.biz.domain.bo.*;
 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.biz.service.service.impl.ObjectMatchServiceImpl;
 import com.taais.common.core.core.domain.CommonResult;
 import com.taais.common.log.annotation.Log;
 import com.taais.common.log.enums.BusinessType;
@@ -69,6 +65,9 @@ public class PublicController extends BaseController {
     @Resource
     ObjectTraceMergeServiceImpl objectTraceMergeService;
 
+    @Resource
+    ObjectMatchServiceImpl objectMatchService;
+
 
 
     // todo: 2024080906
@@ -110,6 +109,15 @@ public class PublicController extends BaseController {
             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_OBJ_MATCH.equals(bizType)){
+            ObjectMatchBo bo = objectMatchService.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);
+            objectMatchService.update(bo);
         } else if (BizConstant.TYPE_DATA_PROCESS.equals(bizType)) {
             errorMsg = dataProcessService.taskResult(resultDTO);
         } else {
@@ -133,7 +141,7 @@ public class PublicController extends BaseController {
             return "bizId 不能为null";
         }
         String bizType = resultDTO.getBizType();
-        if(!BizConstant.TYPE_OBJ_TRACE.equals(bizType) && !BizConstant.TYPE_DATA_BIZ_PROCESS.equals(bizType) && !BizConstant.TYPE_DATA_PROCESS.equals(bizType)){
+        if(!BizConstant.TYPE_OBJ_MATCH.equals(bizType) && !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/ObjectMatch.java

@@ -0,0 +1,64 @@
+package com.taais.biz.domain;
+
+import java.util.Date;
+
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import com.taais.common.orm.core.domain.BaseEntity;
+
+/**
+ * 异源图像匹配对象 object_match
+ *
+ * @author km
+ * 2024-10-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(value = "object_match")
+public class ObjectMatch 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/ObjectMatchBo.java

@@ -0,0 +1,77 @@
+package com.taais.biz.domain.bo;
+
+import com.taais.biz.domain.ObjectMatch;
+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_match
+ *
+ * @author km
+ * @date 2024-10-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ObjectMatch.class, reverseConvertGenerate = false)
+public class ObjectMatchBo extends BaseEntity{
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank(message = "任务名称不能为空")
+    private String name;
+
+    /**
+     * 任务状态
+     */
+    private String status;
+
+    /**
+     * 调用算法时所用的参数
+     */
+    @NotBlank(message = "调用算法时所用的参数不能为空")
+    private String parameters;
+
+    /**
+     * 预处理数据路径
+     */
+    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;
+
+
+}

+ 68 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/ObjectMatchImportVo.java

@@ -0,0 +1,68 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.NoArgsConstructor;
+
+/**
+ * 异源图像匹配导入视图对象 object_match
+ *
+ * @author km
+ * @date 2024-10-28
+ */
+
+@Data
+@NoArgsConstructor
+public class ObjectMatchImportVo 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;
+
+
+}

+ 76 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/ObjectMatchVo.java

@@ -0,0 +1,76 @@
+package com.taais.biz.domain.vo;
+
+import java.util.Date;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.taais.biz.domain.ObjectMatch;
+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_match
+ *
+ * @author km
+ * @date 2024-10-28
+ */
+@Data
+@ExcelIgnoreUnannotated
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ObjectMatch.class)
+public class ObjectMatchVo 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;
+
+
+
+}

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

@@ -0,0 +1,16 @@
+package com.taais.biz.mapper.mapper;
+
+import com.mybatisflex.core.BaseMapper;
+import com.taais.biz.domain.ObjectMatch;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 异源图像匹配Mapper接口
+ *
+ * @author km
+ * 2024-10-28
+ */
+@Mapper
+public interface ObjectMatchMapper extends BaseMapper<ObjectMatch> {
+
+}

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

@@ -0,0 +1,66 @@
+package com.taais.biz.service.service;
+
+import java.util.List;
+
+import com.taais.biz.domain.ObjectMatch;
+import com.taais.biz.domain.bo.ObjectMatchBo;
+import com.taais.biz.domain.vo.ObjectMatchVo;
+import com.taais.common.orm.core.service.IBaseService;
+import com.taais.common.core.core.page.PageResult;
+
+/**
+ * 异源图像匹配Service接口
+ *
+ * @author km
+ * 2024-10-28
+ */
+public interface IObjectMatchService extends IBaseService<ObjectMatch> {
+    /**
+     * 查询异源图像匹配
+     *
+     * @param id 异源图像匹配主键
+     * @return 异源图像匹配
+     */
+        ObjectMatchVo selectById(Long id);
+
+    /**
+     * 查询异源图像匹配列表
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 异源图像匹配集合
+     */
+    List<ObjectMatchVo> selectList(ObjectMatchBo objectMatchBo);
+
+    /**
+     * 分页查询异源图像匹配列表
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 分页异源图像匹配集合
+     */
+    PageResult<ObjectMatchVo> selectPage(ObjectMatchBo objectMatchBo);
+
+    /**
+     * 新增异源图像匹配
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insert(ObjectMatchBo objectMatchBo);
+
+    /**
+     * 修改异源图像匹配
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    boolean update(ObjectMatchBo objectMatchBo);
+
+    /**
+     * 批量删除异源图像匹配
+     *
+     * @param ids 需要删除的异源图像匹配主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    boolean deleteByIds(Long[] ids);
+
+}

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

@@ -0,0 +1,149 @@
+package com.taais.biz.service.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.ObjectMatch;
+import com.taais.biz.domain.bo.ObjectMatchBo;
+import com.taais.biz.domain.bo.ObjectTraceMergeBo;
+import com.taais.biz.domain.vo.ObjectMatchVo;
+import com.taais.biz.mapper.mapper.ObjectMatchMapper;
+import com.taais.biz.service.service.IObjectMatchService;
+import com.taais.common.core.utils.MapstructUtils;
+import com.taais.common.orm.core.page.PageQuery;
+import com.taais.common.core.core.page.PageResult;
+import com.taais.common.orm.core.service.impl.BaseServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import static com.taais.biz.domain.table.ObjectMatchTableDef.OBJECT_MATCH;
+import static com.taais.biz.domain.table.ObjectTraceMergeTableDef.OBJECT_TRACE_MERGE;
+
+
+/**
+ * 异源图像匹配Service业务层处理
+ *
+ * @author km
+ * 2024-10-28
+ */
+@Service
+public class ObjectMatchServiceImpl extends BaseServiceImpl<ObjectMatchMapper, ObjectMatch> implements IObjectMatchService {
+    @Resource
+    private ObjectMatchMapper objectMatchMapper;
+
+    @Override
+    public QueryWrapper query() {
+        return super.query().from(OBJECT_MATCH);
+    }
+
+    private QueryWrapper buildQueryWrapper(ObjectMatchBo objectMatchBo) {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        queryWrapper.and(OBJECT_MATCH.NAME.like
+        (objectMatchBo.getName()));
+        queryWrapper.and(OBJECT_MATCH.STATUS.eq
+        (objectMatchBo.getStatus()));
+        queryWrapper.and(OBJECT_MATCH.PARAMETERS.eq
+        (objectMatchBo.getParameters()));
+        queryWrapper.and(OBJECT_MATCH.PREPROCESS_PATH.eq
+        (objectMatchBo.getPreprocessPath()));
+        queryWrapper.and(OBJECT_MATCH.RESULT_PATH.eq
+        (objectMatchBo.getResultPath()));
+        queryWrapper.and(OBJECT_MATCH.START_TIME.eq
+        (objectMatchBo.getStartTime()));
+        queryWrapper.and(OBJECT_MATCH.END_TIME.eq
+        (objectMatchBo.getEndTime()));
+        queryWrapper.and(OBJECT_MATCH.COST_SECOND.eq
+        (objectMatchBo.getCostSecond()));
+        queryWrapper.and(OBJECT_MATCH.REMARKS.eq
+        (objectMatchBo.getRemarks()));
+
+        return queryWrapper;
+    }
+
+    /**
+     * 查询异源图像匹配
+     *
+     * @param id 异源图像匹配主键
+     * @return 异源图像匹配
+     */
+    @Override
+    public ObjectMatchVo selectById(Long id) {
+            return this.getOneAs(query().where(OBJECT_MATCH.ID.eq(id)), ObjectMatchVo.class);
+
+    }
+
+    public ObjectMatchBo getById(Long id) {
+        return this.getOneAs(query().where(OBJECT_MATCH.ID.eq(id)), ObjectMatchBo.class);
+    }
+
+    /**
+     * 查询异源图像匹配列表
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 异源图像匹配集合
+     */
+    @Override
+    public List<ObjectMatchVo> selectList(ObjectMatchBo objectMatchBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(objectMatchBo);
+            return this.listAs(queryWrapper, ObjectMatchVo.class);
+    }
+
+    /**
+     * 分页查询异源图像匹配列表
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 分页异源图像匹配集合
+     */
+    @Override
+    public PageResult<ObjectMatchVo> selectPage(ObjectMatchBo objectMatchBo) {
+        QueryWrapper queryWrapper = buildQueryWrapper(objectMatchBo);
+            Page<ObjectMatchVo> page = this.pageAs(PageQuery.build(), queryWrapper, ObjectMatchVo.class);
+        return PageResult.build(page);
+    }
+
+    /**
+     * 新增异源图像匹配
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    @Override
+    public boolean insert(ObjectMatchBo objectMatchBo) {
+    ObjectMatch objectMatch =MapstructUtils.convert(objectMatchBo, ObjectMatch. class);
+
+        return this.save(objectMatch);//使用全局配置的雪花算法主键生成器生成ID值
+    }
+
+    /**
+     * 修改异源图像匹配
+     *
+     * @param objectMatchBo 异源图像匹配Bo
+     * @return 结果:true 更新成功,false 更新失败
+     */
+    @Override
+    public boolean update(ObjectMatchBo objectMatchBo) {
+        ObjectMatch objectMatch =MapstructUtils.convert(objectMatchBo, ObjectMatch. class);
+        if (ObjectUtil.isNotNull(objectMatch) && ObjectUtil.isNotNull(objectMatch.getId())){
+            boolean updated = this.updateById(objectMatch);
+                return updated;
+        }
+        return false;
+    }
+
+    /**
+     * 批量删除异源图像匹配
+     *
+     * @param ids 需要删除的异源图像匹配主键集合
+     * @return 结果:true 删除成功,false 删除失败
+     */
+    @Transactional
+    @Override
+    public boolean deleteByIds(Long[] ids) {
+        return this.removeByIds(Arrays.asList(ids));
+    }
+
+}

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