Просмотр исходного кода

1、实体标注信息存储接口;2、实体间关系标注信息存储接口;3、去标注获取文本内容&实体信息&实体间关系信息&历史标注实体信息&历史标注实体间关系信息;4、生成图谱调用算法接口传输标注数据或调用通用图谱接口;5、调用算法文档转txt接口;

guanz 1 год назад
Родитель
Сommit
f11dc43623
36 измененных файлов с 1069 добавлено и 125 удалено
  1. 58 0
      src/main/java/com/pavis/backend/slim/common/utils/CommonUtils.java
  2. 27 0
      src/main/java/com/pavis/backend/slim/framework/config/AlgKgConfig.java
  3. 2 0
      src/main/java/com/pavis/backend/slim/framework/config/SecurityConfig.java
  4. 35 5
      src/main/java/com/pavis/backend/slim/project/system/client/AlgKgClient.java
  5. 49 77
      src/main/java/com/pavis/backend/slim/project/system/controller/AnnotationController.java
  6. 102 0
      src/main/java/com/pavis/backend/slim/project/system/domain/EntityLabelsRelation.java
  7. 104 0
      src/main/java/com/pavis/backend/slim/project/system/domain/EntityLabelsSpan.java
  8. 11 0
      src/main/java/com/pavis/backend/slim/project/system/domain/SysFile.java
  9. 6 1
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationData.java
  10. 15 11
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationEntity.java
  11. 16 9
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationEntityRelation.java
  12. 5 1
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationToAlg.java
  13. 27 0
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ConvertAlgRes.java
  14. 27 0
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ConvertDocToTxt.java
  15. 27 0
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ConvertDocToTxtAlg.java
  16. 29 0
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ToAnnotation.java
  17. 27 0
      src/main/java/com/pavis/backend/slim/project/system/domain/annotation/UniversalGgraphToAlg.java
  18. 17 0
      src/main/java/com/pavis/backend/slim/project/system/mapper/EntityLabelsRelationMapper.java
  19. 16 0
      src/main/java/com/pavis/backend/slim/project/system/mapper/EntityLabelsSpanMapper.java
  20. 49 0
      src/main/java/com/pavis/backend/slim/project/system/service/EntityLablesRelationService.java
  21. 30 0
      src/main/java/com/pavis/backend/slim/project/system/service/EntityLablesSpanService.java
  22. 6 0
      src/main/java/com/pavis/backend/slim/project/system/service/SysEntityService.java
  23. 12 0
      src/main/java/com/pavis/backend/slim/project/system/service/SysFileService.java
  24. 8 0
      src/main/java/com/pavis/backend/slim/project/system/service/SysKgService.java
  25. 7 0
      src/main/java/com/pavis/backend/slim/project/system/service/SysRelationService.java
  26. 156 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/EntityLabelsRelationServiceImpl.java
  27. 58 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/EntityLabelsSpanServiceImpl.java
  28. 11 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysEntityServiceImpl.java
  29. 78 14
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysFileServiceImpl.java
  30. 13 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKgServiceImpl.java
  31. 10 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysRelationServiceImpl.java
  32. 6 0
      src/main/resources/application-formal.yml
  33. 11 5
      src/main/resources/application-ghj.yml
  34. 6 0
      src/main/resources/application-local.yml
  35. 6 0
      src/main/resources/application-minio.yml
  36. 2 2
      src/main/resources/application.yml

+ 58 - 0
src/main/java/com/pavis/backend/slim/common/utils/CommonUtils.java

@@ -0,0 +1,58 @@
+package com.pavis.backend.slim.common.utils;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description:
+ * @date: 2023-11-01 14:25
+ */
+@Slf4j
+public class CommonUtils {
+
+    /**
+     * 判断当前数据是否是一个JSON。
+     * @param jsonStr
+     * @return
+     */
+    public static Boolean isJson(String jsonStr){
+        try {
+            JSONObject jsonObject = JSON.parseObject(jsonStr);
+            if (jsonObject != null) {
+                return true;
+            } else {
+                log.info("该jsonStr不是一个JSON对象");
+            }
+        } catch (Exception e) {
+            log.info("ex -> 该jsonStr不是一个JSON对象:{}",e);
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 判断当前数据是否是一个JSONArray。
+     * @param jsonStr
+     * @return
+     */
+    public static Boolean isJsonArray(String jsonStr){
+        try {
+            Object json = JSON.parse(jsonStr);
+            if (json instanceof JSONArray) {
+                log.info("该jsonStr是一个JSONArray对象");
+                JSONArray jsonArray = (JSONArray) json;
+                return true;
+            } else {
+                log.info("该jsonStr不是一个JSONArray对象");
+            }
+        } catch (Exception e) {
+            log.info("ex -> 该jsonStr不是一个JSONArray对象:{}",e);
+            e.printStackTrace();
+        }
+        return false;
+    }
+}

+ 27 - 0
src/main/java/com/pavis/backend/slim/framework/config/AlgKgConfig.java

@@ -0,0 +1,27 @@
+package com.pavis.backend.slim.framework.config;
+
+import feign.codec.Encoder;
+import feign.form.spring.SpringFormEncoder;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description:
+ * @date: 2023-11-01 10:42
+ */
+@Configuration
+public class AlgKgConfig {
+    @Autowired
+    private ObjectFactory<HttpMessageConverters> messageConverters;
+
+    @Bean
+    public Encoder feignFormEncoder() {
+        return new SpringFormEncoder(new SpringEncoder(messageConverters));
+    }
+}

+ 2 - 0
src/main/java/com/pavis/backend/slim/framework/config/SecurityConfig.java

@@ -127,6 +127,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
+                // todo ghj 算法接收标注信息测试接口,临时使用,后期需要删除。
+                .antMatchers("/annotation/testGenerateKgGraph","/annotation/convertToTxt","/annotation/universalGgraphToAlg").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 35 - 5
src/main/java/com/pavis/backend/slim/project/system/client/AlgKgClient.java

@@ -1,13 +1,43 @@
 package com.pavis.backend.slim.project.system.client;
 
+import com.pavis.backend.slim.framework.config.AlgKgConfig;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
 
 /**
- * 调用算法接口服务
- *
- * @author semi
- * @create 2023-06-07 15:12
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 调用算法接口服务
+ * @date: 2023-10-26 9:47
  */
-@FeignClient("AlgKgService")
+@FeignClient(value = "algKgClient", url = "${algorithm.convert.url}", configuration = AlgKgConfig.class)
 public interface AlgKgClient {
+
+    /**
+     * 发送标注数据给算法服务,生成图谱。
+     * @param data
+     * @return
+     */
+    @PostMapping(value = "/annotation/testGenerateKgGraph",produces = {MediaType.APPLICATION_JSON_VALUE},
+            consumes = "application/json")
+    String sendToAlgForGenerateKgGraph(String data);
+
+    /**
+     * 发送文档需转换为txt的数据给算法服务。
+     * @param data
+     * @return
+     */
+    @PostMapping(value = "/annotation/convertToTxt",produces = {MediaType.APPLICATION_JSON_VALUE},
+            consumes = "application/json")
+    String convertToTxt(String data);
+
+    /**
+     * 通用知识图谱构建,即图谱下无实体、关系数据。
+     * @param data
+     * @return
+     */
+    @PostMapping(value = "/annotation/universalGgraphToAlg",produces = {MediaType.APPLICATION_JSON_VALUE},
+            consumes = "application/json")
+    String universalGgraphToAlg(String data);
 }

Разница между файлами не показана из-за своего большого размера
+ 49 - 77
src/main/java/com/pavis/backend/slim/project/system/controller/AnnotationController.java


+ 102 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/EntityLabelsRelation.java

@@ -0,0 +1,102 @@
+package com.pavis.backend.slim.project.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.pavis.backend.slim.framework.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 实体与实体关系标注信息表。
+ * @date: 2023-10-31 9:47
+ */
+@Builder
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class EntityLabelsRelation extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id。
+     */
+    @ApiModelProperty("主键id")
+    @TableId(type = IdType.AUTO)
+    private String id;
+
+    /**
+     * 知识库所属用户ID。
+     */
+    @ApiModelProperty(value = "图谱ID",required = true)
+    private String kgId;
+
+    /**
+     * 文档ID。
+     */
+    @ApiModelProperty(value = "文档ID",required = true)
+    private String fileId;
+
+    /**
+     * start标注长度
+     */
+    @ApiModelProperty(value = "start标注长度,必填",required = true)
+    private String fromId;
+
+    /**
+     * end标注长度
+     */
+    @ApiModelProperty(value = "end标注长度,必填",required = true)
+    private String toId;
+
+    /**
+     * 标注实体关系类型ID。
+     */
+    @ApiModelProperty("标注实体关系类型ID")
+    private String relationId;
+
+    /**
+     * 标注实体关系文本内容。
+     */
+    @ApiModelProperty("标注实体关系文本内容")
+    private String name;
+
+    /**
+     * 标注实体的用户ID。
+     */
+    @ApiModelProperty("标注实体的用户id")
+    private Long userId;
+
+    /**
+     * UUID 唯一标识ID。
+     */
+    @ApiModelProperty("唯一标识ID。")
+    private String uuid;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    private String remark;
+
+    /**
+     * 知识库链接
+     */
+    @ApiModelProperty("备用字段1")
+    private String attribute1;
+
+    /**
+     * 知识库关键字
+     * 主要用于检索
+     */
+    @ApiModelProperty("备用字段2")
+    private String attribute2;
+}

+ 104 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/EntityLabelsSpan.java

@@ -0,0 +1,104 @@
+package com.pavis.backend.slim.project.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.pavis.backend.slim.framework.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 实体标注信息表。
+ * @date: 2023-10-31 9:47
+ */
+@Builder
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class EntityLabelsSpan extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键id。
+     */
+    @ApiModelProperty("主键id")
+    @TableId(type = IdType.AUTO)
+    private String id;
+
+    /**
+     * 知识库所属用户ID。
+     */
+    @ApiModelProperty(value = "图谱ID",required = true)
+    private String kgId;
+
+    /**
+     * 文档ID。
+     */
+    @ApiModelProperty(value = "文档ID",required = true)
+    private String fileId;
+
+    /**
+     * start标注长度
+     */
+    @ApiModelProperty(value = "start标注长度,必填",required = true)
+    private String startOffset;
+
+    /**
+     * end标注长度
+     */
+    @ApiModelProperty(value = "end标注长度,必填",required = true)
+    private String endOffset;
+
+    /**
+     * 标注实体类型ID。
+     */
+    @ApiModelProperty("标注实体类型ID")
+    private String entityId;
+
+    /**
+     * 标注实体文本内容。
+     */
+    @ApiModelProperty("标注实体文本内容")
+    private String name;
+
+    /**
+     * 标注实体的用户ID。
+     */
+    @ApiModelProperty("标注实体的用户id")
+    private Long userId;
+
+    /**
+     * UUID 唯一标识ID。
+     */
+    @ApiModelProperty("唯一标识ID。")
+    private String uuid;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    private String remark;
+
+    /**
+     * 知识库链接
+     */
+    @ApiModelProperty("备用字段1")
+    private String attribute1;
+
+    /**
+     * 知识库关键字
+     * 主要用于检索
+     */
+    @ApiModelProperty("备用字段2")
+    private String attribute2;
+}

+ 11 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/SysFile.java

@@ -91,6 +91,11 @@ public class SysFile extends BaseEntity {
     @TableField(exist = false)
     private String kbName;
 
+    /**
+     * 文档内容txt.
+     */
+    private String textContent;
+
     public String getKbName() {
         return kbName;
     }
@@ -203,5 +208,11 @@ public class SysFile extends BaseEntity {
         isDir = dir;
     }
 
+    public String getTextContent() {
+        return textContent;
+    }
 
+    public void setTextContent(String textContent) {
+        this.textContent = textContent;
+    }
 }

+ 6 - 1
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationData.java

@@ -1,9 +1,12 @@
 package com.pavis.backend.slim.project.system.domain.annotation;
 
 import com.pavis.backend.slim.framework.web.domain.BaseEntity;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
+import lombok.experimental.SuperBuilder;
 
 import java.util.List;
 
@@ -13,9 +16,11 @@ import java.util.List;
  * @description: 标注信息转换数据结构给算法使用。
  * @date: 2023-10-26 9:47
  */
-@Builder
+@SuperBuilder
 @Getter
 @Setter
+@AllArgsConstructor
+@NoArgsConstructor
 public class AnnotationData {
     // 文章内容。如:乒乓球、羽毛球、网球。
     private String text;

+ 15 - 11
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationEntity.java

@@ -2,9 +2,11 @@ package com.pavis.backend.slim.project.system.domain.annotation;
 
 import com.pavis.backend.slim.framework.web.domain.BaseEntity;
 import io.swagger.models.auth.In;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 /**
@@ -14,25 +16,27 @@ import lombok.Setter;
  * @date: 2023-10-26 9:47
  */
 @Builder
-@Data
 @Getter
 @Setter
+@NoArgsConstructor
+@AllArgsConstructor
 public class AnnotationEntity {
-    private static final long serialVersionUID = 1L;
     // 唯一标识主键id。
-    private Integer id;
+    private Long id;
+    // 图谱ID。
+    private String kgId;
     // 文档关联id
-    private Long fileId;
-    // 用户id。
-    private Long userId;
-    // 标签实体的类型即id,如:运动员、国家。
-    private String label;
+    private String fileId;
     // 开始标注长度。
     private String startOffset;
     // 结束标注长度:需要当前长度+1。
     private String endOffset;
-    // 标签实体名称。
+    // 标签实体的类型即id,如:运动员、国家。
+    private String entityId;
+    // 标注实体文本内容。
     private String name;
-    // 标签实体类型。
-    private String type;
+    // 用户id。
+    private Long userId;
+    // 唯一标识ID。
+    private String uuid;
 }

+ 16 - 9
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationEntityRelation.java

@@ -1,9 +1,11 @@
 package com.pavis.backend.slim.project.system.domain.annotation;
 
 import com.pavis.backend.slim.framework.web.domain.BaseEntity;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 /**
@@ -13,22 +15,27 @@ import lombok.Setter;
  * @date: 2023-10-26 9:47
  */
 @Builder
-@Data
 @Getter
 @Setter
+@AllArgsConstructor
+@NoArgsConstructor
 public class AnnotationEntityRelation {
     // 唯一标识主键id。
     private Integer id;
+    // 图谱ID。
+    private String kgId;
     // 文档关联id
-    private Long fileId;
-    // 用户id。
-    private Long userId;
-    // 标签实体关系的类型即id,如:是、国籍等。
-    private String type;
-    // 开始标注长度。
+    private String fileId;
+    // 开始实体ID。
     private String fromId;
-    // 结束标注长度:需要当前长度+1
+    // 结束实体ID。
     private String toId;
-    // 标签实体关系名称。
+    // 标签实体关系的类型即id,如:是、国籍等。
+    private String relationId;
+    // 标注实体关系文本内容。
     private String name;
+    // 用户id。
+    private Long userId;
+    // 唯一标识ID。
+    private String uuid;
 }

+ 5 - 1
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/AnnotationToAlg.java

@@ -1,8 +1,10 @@
 package com.pavis.backend.slim.project.system.domain.annotation;
 
 import com.pavis.backend.slim.framework.web.domain.BaseEntity;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 import java.util.List;
@@ -16,9 +18,11 @@ import java.util.List;
 @Builder
 @Getter
 @Setter
+@NoArgsConstructor
+@AllArgsConstructor
 public class AnnotationToAlg {
     // 唯一标识主键id。
-    private Integer kgId;
+    private String kgId;
     // 该知识库下所有标注的实体、实体关系、文章内容数据。如:体育库下的10个乒乓球文档标注、3个羽毛球文档标注、7个网球文档标注都要给算法。
     private List<AnnotationData> annotationDatas; // 即一共三个list:乒乓球、羽毛球、网球。
 }

+ 27 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ConvertAlgRes.java

@@ -0,0 +1,27 @@
+package com.pavis.backend.slim.project.system.domain.annotation;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 算法返回数据,即文档转换为txt文本内容。
+ * @date: 2023-11-01 14:04
+ */
+@Builder
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConvertAlgRes {
+    // 错误代码,如果errorCode=0 表示正常解析,可以获取文本内容;非零即其他情况,均有各种解析异常,无法获取文本内容
+    private String errorCode;
+    // 文件ID。
+    private String fileId;
+    // 转换后的txt文本内容。
+    private String text;
+}

+ 27 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ConvertDocToTxt.java

@@ -0,0 +1,27 @@
+package com.pavis.backend.slim.project.system.domain.annotation;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 文档数据发送给算法获取文档转换后的txt文本内容。
+ * @date: 2023-11-01 14:04
+ */
+@Builder
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConvertDocToTxt {
+    // 文件ID。
+    private String fileId;
+    // 文件在oss中的key值。
+    private String objectKey;
+    // 文件md5值。
+    private String identifier;
+}

+ 27 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ConvertDocToTxtAlg.java

@@ -0,0 +1,27 @@
+package com.pavis.backend.slim.project.system.domain.annotation;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 文档数据发送给算法获取文档转换后的txt文本内容。
+ * @date: 2023-11-01 14:04
+ */
+@Builder
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConvertDocToTxtAlg {
+    // 算法需要根据此key获取到文件列表,即:fileId、objectKey、identifier。
+    private String files;
+    // 待转换的文件列表。
+    private List<ConvertDocToTxt> comments;
+}

+ 29 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/ToAnnotation.java

@@ -0,0 +1,29 @@
+package com.pavis.backend.slim.project.system.domain.annotation;
+
+import com.pavis.backend.slim.project.system.domain.SysEntity;
+import com.pavis.backend.slim.project.system.domain.SysRelation;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.SuperBuilder;
+
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: 标注信息转换数据结构给算法使用。
+ * @date: 2023-10-26 9:47
+ */
+@SuperBuilder
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ToAnnotation extends AnnotationData{
+    // 该知识库下的所有实体信息。
+    private List<SysEntity> entityList;
+    // 该知识库下的所有实体间关系信息。
+    private List<SysRelation> relationList;
+}

+ 27 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/annotation/UniversalGgraphToAlg.java

@@ -0,0 +1,27 @@
+package com.pavis.backend.slim.project.system.domain.annotation;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.SuperBuilder;
+
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description:
+ * @date: 2023-11-02 13:18
+ */
+@SuperBuilder
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class UniversalGgraphToAlg {
+    // 图谱ID。
+    private String kgId;
+    // 该图谱下的所有文档ID列表。
+    private List<String> fileIds;
+}

+ 17 - 0
src/main/java/com/pavis/backend/slim/project/system/mapper/EntityLabelsRelationMapper.java

@@ -0,0 +1,17 @@
+package com.pavis.backend.slim.project.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsRelation;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsSpan;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: EntityLabelsRelationMapper
+ * @date: 2023-10-31 10:18
+ */
+@Mapper
+public interface EntityLabelsRelationMapper extends BaseMapper<EntityLabelsRelation> {
+
+}

+ 16 - 0
src/main/java/com/pavis/backend/slim/project/system/mapper/EntityLabelsSpanMapper.java

@@ -0,0 +1,16 @@
+package com.pavis.backend.slim.project.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsSpan;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: EntityLabelsSpanMapper
+ * @date: 2023-10-31 10:25
+ */
+@Mapper
+public interface EntityLabelsSpanMapper extends BaseMapper<EntityLabelsSpan> {
+
+}

+ 49 - 0
src/main/java/com/pavis/backend/slim/project/system/service/EntityLablesRelationService.java

@@ -0,0 +1,49 @@
+package com.pavis.backend.slim.project.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsRelation;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsSpan;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationData;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationEntity;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationEntityRelation;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationToAlg;
+import com.pavis.backend.slim.project.system.domain.annotation.ToAnnotation;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: EntityLablesRelationService
+ * @date: 2023-10-31 10:25
+ */
+public interface EntityLablesRelationService extends IService<EntityLabelsRelation> {
+    /**
+     * 文档标注数据存储接口-实体关系。
+     * @param relation
+     * @return
+     */
+    EntityLabelsRelation saveAnnotationRelation(AnnotationEntityRelation relation);
+
+    /**
+     * 去标注页面,获取文本信息、知识库实体信息、知识库实体间关系信息、历史标注实体信息、历史标注实体间关系信息。
+     * @param kgId
+     * @param fileId
+     * @return
+     */
+    ToAnnotation toAnnotation(String kgId, String fileId);
+
+    /**
+     * 根据图谱id和文档id获取历史标注实体关系信息数据列表。
+     * @return
+     */
+    List<AnnotationEntityRelation> getAnnotationEntityRelationByKgIdAndFileId(String kgId, String fileId);
+
+    /**
+     * 生成图谱,根据kgId获取text、标注实体数据列表、标注实体关系数据列表等数据给算法。
+     * @param kgId
+     * @return
+     */
+    AnnotationToAlg generateKgGraph(String kgId);
+}

+ 30 - 0
src/main/java/com/pavis/backend/slim/project/system/service/EntityLablesSpanService.java

@@ -0,0 +1,30 @@
+package com.pavis.backend.slim.project.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsSpan;
+import com.pavis.backend.slim.project.system.domain.SysUser;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationEntity;
+
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: EntityLablesSpanService
+ * @date: 2023-10-31 10:25
+ */
+public interface EntityLablesSpanService extends IService<EntityLabelsSpan> {
+
+    /**
+     * 文档标注数据存储接口-实体。
+     * @param entity
+     * @return
+     */
+    EntityLabelsSpan saveAnnotationEntity(AnnotationEntity entity);
+
+    /**
+     * 根据图谱id和文档id获取历史标注实体信息数据列表。
+     * @return
+     */
+    List<AnnotationEntity> getAnnotationEntityByKgIdAndFileId(String kgId,String fileId);
+}

+ 6 - 0
src/main/java/com/pavis/backend/slim/project/system/service/SysEntityService.java

@@ -39,4 +39,10 @@ public interface SysEntityService extends IService<SysEntity> {
      * @param entityId 实体id
      */
     void entityDel(String entityId);
+
+    /**
+     * 根据图谱ID获取该图谱下的实体列表。
+     * @param kgId
+     */
+    List<SysEntity> getEntityByKgId(String kgId);
 }

+ 12 - 0
src/main/java/com/pavis/backend/slim/project/system/service/SysFileService.java

@@ -95,4 +95,16 @@ public interface SysFileService extends IService<SysFile> {
      * @param fileId
      */
     void onlyOfficeToMinio(String fileId, String path, HttpServletResponse response, HttpServletRequest request);
+
+    /**
+     * 根据文档id,获取文档的文本内容。
+     * @param fileId
+     * @return
+     */
+    String getFileTextContent(String fileId);
+
+    /**
+     * 文档转换成txt:调用算法文档转换txt接口,并保存文本内容。
+     */
+    void convertToTxt(List<String> fileIds);
 }

+ 8 - 0
src/main/java/com/pavis/backend/slim/project/system/service/SysKgService.java

@@ -1,6 +1,7 @@
 package com.pavis.backend.slim.project.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.backend.slim.project.system.domain.SysEntity;
 import com.pavis.backend.slim.project.system.domain.SysEntityAll;
 import com.pavis.backend.slim.project.system.domain.SysKg;
 import com.pavis.backend.slim.project.system.domain.algorithm.AlgSpO;
@@ -72,4 +73,11 @@ public interface SysKgService extends IService<SysKg> {
      * @return 实体实例关系的数据集合
      */
     public List<SysEntityAll> selEntityAll(String kgId);
+
+    /**
+     * 根据kgId获取文档列表。
+     * @param kgId
+     * @return
+     */
+    List<String> getFileIdsByKgId(String kgId);
 }

+ 7 - 0
src/main/java/com/pavis/backend/slim/project/system/service/SysRelationService.java

@@ -37,4 +37,11 @@ public interface SysRelationService extends IService<SysRelation> {
      * @param relationId 实体关系ID
      */
     void ratationDel(String relationId);
+
+    /**
+     * 根据图谱id获取实体间关联关系。
+     * @param kgId
+     * @return
+     */
+    List<SysRelation> getRelationByKgId(String kgId);
 }

+ 156 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/EntityLabelsRelationServiceImpl.java

@@ -0,0 +1,156 @@
+package com.pavis.backend.slim.project.system.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.backend.slim.project.system.client.AlgKgClient;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsRelation;
+import com.pavis.backend.slim.project.system.domain.SysEntity;
+import com.pavis.backend.slim.project.system.domain.SysRelation;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationData;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationEntity;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationEntityRelation;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationToAlg;
+import com.pavis.backend.slim.project.system.domain.annotation.ToAnnotation;
+import com.pavis.backend.slim.project.system.domain.annotation.UniversalGgraphToAlg;
+import com.pavis.backend.slim.project.system.mapper.EntityLabelsRelationMapper;
+import com.pavis.backend.slim.project.system.service.EntityLablesRelationService;
+import com.pavis.backend.slim.project.system.service.EntityLablesSpanService;
+import com.pavis.backend.slim.project.system.service.SysEntityService;
+import com.pavis.backend.slim.project.system.service.SysFileService;
+import com.pavis.backend.slim.project.system.service.SysKgService;
+import com.pavis.backend.slim.project.system.service.SysRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: EntityLabelsRelationServiceImpl
+ * @date: 2023-10-31 10:25
+ */
+@Slf4j
+@Service
+public class EntityLabelsRelationServiceImpl extends ServiceImpl<EntityLabelsRelationMapper, EntityLabelsRelation> implements EntityLablesRelationService {
+
+    @Autowired
+    private SysFileService sysFileService;
+
+    @Autowired
+    private SysEntityService sysEntityService;
+
+    @Autowired
+    private SysRelationService sysRelationService;
+
+    @Autowired
+    private EntityLablesSpanService entityLablesSpanService;
+
+    @Autowired
+    private SysKgService sysKgService;
+
+    @Autowired
+    private AlgKgClient algKgClient;
+
+    @Override
+    public EntityLabelsRelation saveAnnotationRelation(AnnotationEntityRelation relation) {
+        EntityLabelsRelation entityLabelsRelation = new EntityLabelsRelation();
+        BeanUtils.copyProperties(relation,entityLabelsRelation);
+        int insert = baseMapper.insert(entityLabelsRelation);
+        log.info("标注的实体信息存储结果res:{},entityLabelsRelation:{}",insert, JSON.toJSONString(entityLabelsRelation));
+        return entityLabelsRelation;
+    }
+
+    @Override
+    public ToAnnotation toAnnotation(String kgId, String fileId) {
+
+        // 1.根据fileId获取文本信息text、历史标注的实体信息列表、历史标注的实体间关系信息列表。
+        // List<TreeFile> treeFiles = sysFileService.listTreeFiles(kgId);
+        // log.info("获取知识库下的文档信息treeFiles:{}",JSON.toJSONString(treeFiles));
+        String fileTextContent = sysFileService.getFileTextContent(fileId);
+        if (null != fileTextContent && StringUtils.isNotBlank(fileTextContent)){
+            log.info("文本内容不为空:{}",fileTextContent);
+            // 1.1 获取历史标注实体信息数据列表。
+            List<AnnotationEntity> entities = entityLablesSpanService.getAnnotationEntityByKgIdAndFileId(kgId, fileId);
+            // 1.2 获取历史标注实体间关系数据列表。
+            List<AnnotationEntityRelation> relations = getAnnotationEntityRelationByKgIdAndFileId(kgId, fileId);
+
+            // 2.根据kgId获取知识库下的所有实体信息列表;
+            List<SysEntity> entityLists = sysEntityService.getEntityByKgId(kgId);
+            // 3.根据kgId获取知识库下的所有实体间关系信息列表。
+            List<SysRelation> relationLists = sysRelationService.getRelationByKgId(kgId);
+            ToAnnotation toAnnotation = ToAnnotation.builder().text(fileTextContent).entities(entities).relations(relations)
+                    .entityList(entityLists).relationList(relationLists).build();
+            return toAnnotation;
+        }
+        return null;
+    }
+
+    @Override
+    public List<AnnotationEntityRelation> getAnnotationEntityRelationByKgIdAndFileId(String kgId, String fileId) {
+        List<EntityLabelsRelation> entityLabelsRelations = baseMapper.selectList(new QueryWrapper<EntityLabelsRelation>().lambda()
+                .eq(EntityLabelsRelation::getKgId, kgId).eq(EntityLabelsRelation::getFileId,fileId));
+        List<AnnotationEntityRelation> annotationEntityRelations = new ArrayList<>();
+        AnnotationEntityRelation annotationEntityRelation;
+        for (EntityLabelsRelation entityLabelsRelation : entityLabelsRelations) {
+            annotationEntityRelation = new AnnotationEntityRelation();
+            BeanUtils.copyProperties(entityLabelsRelation,annotationEntityRelation);
+            // 处理个别字段,fileId是string类型的。
+            annotationEntityRelations.add(annotationEntityRelation);
+        }
+        return annotationEntityRelations;
+    }
+
+    @Override
+    public AnnotationToAlg generateKgGraph(String kgId) {
+        // 1. 首先根据kgId获取图谱构建的实体、关系数据。
+        List<SysEntity> entityByKgId = sysEntityService.getEntityByKgId(kgId);
+        // 根据kgId获取文档id列表。
+        List<String> fileIds = sysKgService.getFileIdsByKgId(kgId);
+        // 2. 判断该图谱是否创建实体和关系数据。
+        if (CollectionUtils.isEmpty(entityByKgId)){
+            // 2.1 如果该图谱的未创建实体和关系数据,则调用算法另一个服务,入参为:fileIds列表、kgId。
+            // todo 调用算法另一个服务。
+            UniversalGgraphToAlg universalGgraphToAlg = UniversalGgraphToAlg.builder().kgId(kgId).fileIds(fileIds).build();
+            String universalGgraphToAlgRes = algKgClient.universalGgraphToAlg(JSON.toJSONString(universalGgraphToAlg));
+            log.info("该图谱无实体、关系数据时,调用通用知识图谱算法接口返回res:{}",universalGgraphToAlgRes);
+            return new AnnotationToAlg();
+        }else {
+            // 2.2 如果该图谱的创建了实体和关系数据,则调用算法的生成图谱服务,即入参为:text、实体标注数据列表、实体关系标注数据列表。
+            // 如果图谱有实体关系数据,且标注了数据,则发送标注的数据给算法;如果该文档未被标注则不发送。如果仅有实体关系数据,所有文档均未被标注,也发送,只不过标注数据为空。
+            // 图谱下的所有文档标注信息。
+            List<AnnotationData> annotationDatas = new ArrayList<>();
+            for (String fileId : fileIds) {
+                String fileTextContent = sysFileService.getFileTextContent(fileId);
+                if (null != fileTextContent && StringUtils.isNotBlank(fileTextContent)){
+                    log.info("文本内容不为空:{}",fileTextContent);
+                    log.info("--->fileId:{}",fileId);
+                    // 获取历史标注实体信息数据列表,即知识库下的实体标注信息列表。
+                    List<AnnotationEntity> entities = entityLablesSpanService.getAnnotationEntityByKgIdAndFileId(kgId, fileId);
+                    // 如果标注实体数据不为空,则需要发送给算法,否则不发。
+                    if(!CollectionUtils.isEmpty(entities)){
+                        log.info("--->entities:{}",entities.size());
+                        // 获取历史标注实体间关系数据列表,即图谱下的实体关系标注信息列表。
+                        List<AnnotationEntityRelation> relations = getAnnotationEntityRelationByKgIdAndFileId(kgId, fileId);
+                        log.info("--->relations:{}",entities.size());
+                        AnnotationData annotationData = AnnotationData.builder().text(fileTextContent).entities(entities).relations(relations).build();
+                        annotationDatas.add(annotationData);
+                    }
+                }
+            }
+            // 3.算法所需数据结构。
+            AnnotationToAlg annotationToAlg = AnnotationToAlg.builder().kgId(kgId).annotationDatas(annotationDatas).build();
+            log.info("标注数据待发送至算法数据结构annotationToAlg:{}",JSON.toJSONString(annotationToAlg));
+            // todo 4. 发送数据给算法。
+            String algRes = algKgClient.sendToAlgForGenerateKgGraph(JSON.toJSONString(annotationToAlg));
+            log.info("该图谱存在实体关系数据时发送标注数据列表,调用算法生成知识图谱接口返回algRes:{}",algRes);
+            return annotationToAlg;
+        }
+    }
+}

+ 58 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/EntityLabelsSpanServiceImpl.java

@@ -0,0 +1,58 @@
+package com.pavis.backend.slim.project.system.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsRelation;
+import com.pavis.backend.slim.project.system.domain.EntityLabelsSpan;
+import com.pavis.backend.slim.project.system.domain.annotation.AnnotationEntity;
+import com.pavis.backend.slim.project.system.mapper.EntityLabelsRelationMapper;
+import com.pavis.backend.slim.project.system.mapper.EntityLabelsSpanMapper;
+import com.pavis.backend.slim.project.system.service.EntityLablesRelationService;
+import com.pavis.backend.slim.project.system.service.EntityLablesSpanService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @version: java version 1.8
+ * @Author: Guan H.J.
+ * @description: EntityLabelsSpanServiceImpl
+ * @date: 2023-10-31 10:25
+ */
+@Service
+@Slf4j
+public class EntityLabelsSpanServiceImpl extends ServiceImpl<EntityLabelsSpanMapper, EntityLabelsSpan> implements EntityLablesSpanService {
+
+    @Autowired
+    private EntityLabelsSpanMapper entityLabelsSpanMapper;
+
+    @Override
+    public EntityLabelsSpan saveAnnotationEntity(AnnotationEntity entity) {
+        // 将前端传过来的实体信息进行存储,备注:不对实体信息做判重信息。
+        EntityLabelsSpan entityLabelsSpan = new EntityLabelsSpan();
+        BeanUtils.copyProperties(entity,entityLabelsSpan);
+        int insert = entityLabelsSpanMapper.insert(entityLabelsSpan);
+        log.info("标注的实体信息存储结果res:{},entityLabelsSpan:{}",insert, JSON.toJSONString(entityLabelsSpan));
+        return entityLabelsSpan;
+    }
+
+    @Override
+    public List<AnnotationEntity> getAnnotationEntityByKgIdAndFileId(String kgId,String fileId) {
+        List<EntityLabelsSpan> entityLabelsSpans = baseMapper.selectList(new QueryWrapper<EntityLabelsSpan>().lambda()
+                .eq(EntityLabelsSpan::getKgId, kgId).eq(EntityLabelsSpan::getFileId,fileId));
+        List<AnnotationEntity> annotationEntities = new ArrayList<>();
+        AnnotationEntity annotationEntity;
+        for (EntityLabelsSpan entityLabelsSpan : entityLabelsSpans) {
+            annotationEntity = new AnnotationEntity();
+            BeanUtils.copyProperties(entityLabelsSpan,annotationEntity);
+            // 处理个别字段,fileId是string类型的。
+            annotationEntities.add(annotationEntity);
+        }
+        return annotationEntities;
+    }
+}

+ 11 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysEntityServiceImpl.java

@@ -2,12 +2,14 @@ package com.pavis.backend.slim.project.system.service.impl;
 
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.backend.slim.common.utils.SecurityUtils;
 import com.pavis.backend.slim.project.system.domain.SysEntity;
 import com.pavis.backend.slim.project.system.mapper.SysEntityMapper;
 import com.pavis.backend.slim.project.system.service.SysEntityService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.catalina.security.SecurityUtil;
 import org.springframework.stereotype.Service;
 
@@ -19,6 +21,7 @@ import java.util.List;
  * @create 2023-06-07 13:31
  */
 @Service
+@Slf4j
 public class SysEntityServiceImpl extends ServiceImpl<SysEntityMapper, SysEntity> implements SysEntityService {
 
 
@@ -50,4 +53,12 @@ public class SysEntityServiceImpl extends ServiceImpl<SysEntityMapper, SysEntity
     public void entityDel(String entityId) {
         baseMapper.deleteById(entityId);
     }
+
+    @Override
+    public List<SysEntity> getEntityByKgId(String kgId) {
+        List<SysEntity> sysEntity = baseMapper.selectList(new QueryWrapper<SysEntity>().lambda().eq(SysEntity::getKgId,kgId));
+        log.info("根据图谱id获取实体数据列表sysEntity:{}", JSON.toJSONString(sysEntity));
+        return sysEntity;
+    }
+
 }

+ 78 - 14
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysFileServiceImpl.java

@@ -4,32 +4,30 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.MD5;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.backend.slim.common.constant.Constant;
 import com.pavis.backend.slim.common.exception.ServiceException;
+import com.pavis.backend.slim.common.utils.CommonUtils;
 import com.pavis.backend.slim.common.utils.FileUtils;
 import com.pavis.backend.slim.common.utils.SecurityUtils;
 import com.pavis.backend.slim.framework.minio.MinioStorage;
+import com.pavis.backend.slim.project.system.client.AlgKgClient;
 import com.pavis.backend.slim.project.system.domain.SysFile;
+import com.pavis.backend.slim.project.system.domain.annotation.ConvertAlgRes;
+import com.pavis.backend.slim.project.system.domain.annotation.ConvertDocToTxt;
 import com.pavis.backend.slim.project.system.domain.vo.TreeFile;
 import com.pavis.backend.slim.project.system.mapper.SysFileMapper;
 import com.pavis.backend.slim.project.system.service.SysFileService;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.compress.utils.IOUtils;
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileItemFactory;
-import org.apache.commons.fileupload.disk.DiskFileItem;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StreamUtils;
 import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -39,12 +37,14 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.net.URL;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -58,6 +58,9 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
     @Autowired
     MinioStorage storage;
 
+    @Autowired
+    private AlgKgClient algKgClient;
+
     @Override
     public SysFile uploadFile(MultipartFile file) {
         SysFile sysFile = uploadFile(file, "", Constant.DIR_SEP, false);
@@ -285,8 +288,69 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         }
     }
 
+    @Override
+    public String getFileTextContent(String fileId) {
+        SysFile sysFile = baseMapper.selectById(fileId);
+        if (null != sysFile && null != sysFile.getTextContent() && StringUtils.isNotEmpty(sysFile.getTextContent())) {
+            log.info("文本内容不为空:{}",sysFile.getFileId());
+            return sysFile.getTextContent();
+        }
+        return null;
+    }
+
+    @Override
+    public void convertToTxt(List<String> fileIds) {
+        List<SysFile> sysFiles = baseMapper.selectList(new QueryWrapper<SysFile>().lambda().in(SysFile::getFileId, fileIds));
+        if (!CollectionUtils.isEmpty(sysFiles)) {
+            List<ConvertDocToTxt> convertDocToTxts = new ArrayList<>();
+            for (SysFile sysFile : sysFiles) {
+                // 三个条件均不为空时,才调用算法获取文档转换成txt结果。
+                if (null != sysFile && null != sysFile.getObjectKey() && null != sysFile.getIdentifier()) {
+                    convertDocToTxts.add(ConvertDocToTxt.builder().fileId(sysFile.getFileId()).objectKey(sysFile.getObjectKey()).identifier(sysFile.getIdentifier()).build());
+                }
+            }
+            if (!CollectionUtils.isEmpty(convertDocToTxts)) {
+                Map<String, Object> algMap = new HashMap<>();
+                algMap.put("files", convertDocToTxts);
+                // 调用算法,获取文档转换为txt的文本内容。
+                String convertToTxtResTmp = algKgClient.convertToTxt(JSON.toJSONString(algMap));
+                if (null != convertToTxtResTmp && StringUtils.isNotEmpty(convertToTxtResTmp) && CommonUtils.isJsonArray(convertToTxtResTmp)) {
+                    // 解析算法返回数据。
+                    try {
+                        List<ConvertAlgRes> convertAlgRes = JSONArray.parseArray(convertToTxtResTmp, ConvertAlgRes.class);
+                        if (!CollectionUtils.isEmpty(convertAlgRes)) {
+                            for (ConvertAlgRes algRes : convertAlgRes) {
+                                if (null != algRes.getErrorCode() && "0".equals(algRes.getErrorCode())) {
+                                    // 调用算法接口成功,并且解析txt文件成功,将文本内容更新至sysFile的textContent字段中。
+                                    SysFile sysFile = baseMapper.selectById(algRes.getFileId());
+                                    if (null != sysFile) {
+                                        // 更新文本内容。
+                                        sysFile.setTextContent(algRes.getText());
+                                        int updateText = baseMapper.updateById(sysFile);
+                                        log.info("更新文本内容结果updateText:{}", updateText);
+                                    }
+                                } else {
+                                    log.info("算法文档转换txt接口 TXT未解析成功:{}", JSON.toJSONString(algRes));
+                                }
+                            }
+                        } else {
+                            log.info("算法文档转换txt接口 返回数据为NULL ex convertAlgRes:{}", JSON.toJSONString(convertAlgRes));
+                        }
+                    } catch (Exception ex) {
+                        log.info("算法文档转换txt接口 返回数据异常 NOT JSONArray ex:{}", JSON.toJSONString(convertToTxtResTmp));
+                    }
+                } else {
+                    log.info("算法文档转换txt接口异常 ex convertToTxtResTmp:{}", convertToTxtResTmp);
+                }
+            }
+        } else {
+            log.info("未检索到相关的sysFile。");
+        }
+    }
+
     /**
      * 用户编辑的文件上传至minio中。
+     *
      * @param path
      * @param selSysFile
      * @param response
@@ -346,7 +410,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
 
                     // 更新sysFile值。
                     selSysFile.setName(fileName);
-                    log.info("fileName:{},key:{}",fileName,selSysFile.getName());
+                    log.info("fileName:{},key:{}", fileName, selSysFile.getName());
                     // 生成新的key。http://192.168.1.141:8989/cache/files/data/181ba63c8d60452c_2481/output.docx/output.docx?md5=z3NfV5Oj4OhFo6Yo6mk2jw&expires=1692692984&filename=output.docx
                     String objKey = storage.genKeyWithPath(selSysFile.getUserId(), selSysFile.getName(), path);
                     selSysFile.setObjectKey(objKey);
@@ -370,9 +434,9 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
                         baseMapper.updateById(selSysFile);
                         if (file.exists()) {
                             boolean deleteFlag = deleteFile(file.getPath());
-                            log.info("file del path:{},deleteFlag:{}",file.getPath(),deleteFlag);
+                            log.info("file del path:{},deleteFlag:{}", file.getPath(), deleteFlag);
                             boolean delete = file.delete();
-                            log.info("delete res:{}",delete);
+                            log.info("delete res:{}", delete);
                             if (delete) {
                                 log.info("本地临时写入的文件已删除:{}", filePath);
                             }

+ 13 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKgServiceImpl.java

@@ -40,12 +40,14 @@ import com.pavis.backend.slim.project.system.service.SysFileService;
 import com.pavis.backend.slim.project.system.service.SysKgService;
 import com.pavis.backend.slim.project.system.service.SysRelationService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import springfox.documentation.spring.web.json.Json;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -397,4 +399,15 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
         }
         return null;
     }
+
+    @Override
+    public List<String> getFileIdsByKgId(String kgId) {
+        SysKg sysKg = baseMapper.selectById(kgId);
+        if(null != sysKg && null != sysKg.getFileIds() && StringUtils.isNotBlank(sysKg.getFileIds())){
+            String[] fileIdsTmp = sysKg.getFileIds().split(",");
+            List<String> fileIds = Arrays.asList(fileIdsTmp);
+            return fileIds;
+        }
+        return null;
+    }
 }

+ 10 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysRelationServiceImpl.java

@@ -2,6 +2,7 @@ package com.pavis.backend.slim.project.system.service.impl;
 
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.backend.slim.common.utils.SecurityUtils;
@@ -11,6 +12,7 @@ import com.pavis.backend.slim.project.system.mapper.SysEntityRelationMapper;
 import com.pavis.backend.slim.project.system.mapper.SysRelationMapper;
 import com.pavis.backend.slim.project.system.service.SysEntityRelationService;
 import com.pavis.backend.slim.project.system.service.SysRelationService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -20,6 +22,7 @@ import java.util.List;
  * @create 2023-06-07 13:31
  */
 @Service
+@Slf4j
 public class SysRelationServiceImpl extends ServiceImpl<SysRelationMapper, SysRelation> implements SysRelationService {
 
     @Override
@@ -48,4 +51,11 @@ public class SysRelationServiceImpl extends ServiceImpl<SysRelationMapper, SysRe
     public void ratationDel(String relationId) {
         baseMapper.deleteById(relationId);
     }
+
+    @Override
+    public List<SysRelation> getRelationByKgId(String kgId) {
+        List<SysRelation> sysRelations = baseMapper.selectList(new QueryWrapper<SysRelation>().lambda().eq(SysRelation::getKgId, kgId));
+        log.info("根据图谱id获取实体间关系数据列表sysRelations:{}", JSON.toJSONString(sysRelations));
+        return sysRelations;
+    }
 }

+ 6 - 0
src/main/resources/application-formal.yml

@@ -75,6 +75,12 @@ algorithm:
   creat:
     # 将所需要生成图谱的文件,传给算法的接口
     url: http://192.168.1.150:8900/data_access
+    # 文档转换为txt文本内容接口。
+  convert:
+    url: http://192.168.1.127:8068
+    # 通用图谱调用算法接口。即未创建实体和关系。
+  universalGraph:
+    url: http://192.168.1.127:8068
 
 #PageHelper 分页插件配置
 pagehelper:

+ 11 - 5
src/main/resources/application-ghj.yml

@@ -40,24 +40,25 @@ spring:
 #          password: 123456
 #          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
         master:
-          url: jdbc:mysql://192.168.1.141:3310/slim
+          url: jdbc:mysql://192.168.1.52:3310/slim
           username: root
           password: Gky.i3g8,
           driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
         slave_1:
-          url: jdbc:mysql://192.168.1.141:3311/slim
+          url: jdbc:mysql://192.168.1.52:3311/slim
           username: root
           password: Gky.i3g8,
           driver-class-name: com.mysql.cj.jdbc.Driver
         slave_2:
-          url: jdbc:mysql://192.168.1.141:3312/slim
+          url: jdbc:mysql://192.168.1.52:3312/slim
           username: root
           password: Gky.i3g8,
           driver-class-name: com.mysql.cj.jdbc.Driver
   # redis 配置
   redis:
 #    # 地址
-    host: 192.168.1.141
+#    host: 192.168.1.141
+    host: localhost
 #    # 端口,默认为6379
     port: 6379
 # feign 配置
@@ -79,7 +80,12 @@ algorithm:
   creat:
     # 将所需要生成图谱的文件,传给算法的接口
     url: http://192.168.1.150:8900/data_access
-
+    # 文档转换为txt文本内容接口。
+  convert:
+    url: http://192.168.1.127:8068
+    # 通用图谱调用算法接口。即未创建实体和关系。
+  universalGraph:
+    url: http://192.168.1.127:8068
 #PageHelper 分页插件配置
 pagehelper:
   helperDialect: mysql

+ 6 - 0
src/main/resources/application-local.yml

@@ -79,6 +79,12 @@ algorithm:
   creat:
     # 将所需要生成图谱的文件,传给算法的接口
     url: http://192.168.1.150:8900/data_access
+    # 文档转换为txt文本内容接口。
+  convert:
+    url: http://192.168.1.127:8068
+    # 通用图谱调用算法接口。即未创建实体和关系。
+  universalGraph:
+    url: http://192.168.1.127:8068
 
 #PageHelper 分页插件配置
 pagehelper:

+ 6 - 0
src/main/resources/application-minio.yml

@@ -84,6 +84,12 @@ algorithm:
   creat:
     # 将所需要生成图谱的文件,传给算法的接口
     url: http://192.168.1.150:8900/data_access
+    # 文档转换为txt文本内容接口。
+  convert:
+    url: http://192.168.1.127:8068
+    # 通用图谱调用算法接口。即未创建实体和关系。
+  universalGraph:
+    url: http://192.168.1.127:8068
 
 #PageHelper 分页插件配置
 pagehelper:

+ 2 - 2
src/main/resources/application.yml

@@ -1,7 +1,7 @@
 spring:
   profiles:
-#    active: ghj
-    active: local
+    active: ghj
+#    active: local
   # 国际化资源文件路径
   messages:
     basename: i18n/messages

Некоторые файлы не были показаны из-за большого количества измененных файлов