lrj 4 days ago
parent
commit
395aa50407
34 changed files with 1583 additions and 12 deletions
  1. 82 0
      pom.xml
  2. 5 0
      src/main/java/com/example/demo/config/Contents.java
  3. 27 0
      src/main/java/com/example/demo/controller/GetFileTextController.java
  4. 0 1
      src/main/java/com/example/demo/controller/NoveltyController.java
  5. 36 0
      src/main/java/com/example/demo/controller/PatentFileCheckController.java
  6. 11 0
      src/main/java/com/example/demo/model/dify/ChatMessageDTO.java
  7. 10 0
      src/main/java/com/example/demo/model/dify/ClaimExplainVO.java
  8. 4 3
      src/main/java/com/example/demo/model/DifyChatMessageDTO.java
  9. 3 2
      src/main/java/com/example/demo/model/DifyFile.java
  10. 11 0
      src/main/java/com/example/demo/model/dify/DifyHistoryMessageDTO.java
  11. 11 0
      src/main/java/com/example/demo/model/dify/FluxMessageVO.java
  12. 9 0
      src/main/java/com/example/demo/model/dify/GenerateClaimDTO.java
  13. 16 0
      src/main/java/com/example/demo/model/dify/GenerateInstructAnswerVO.java
  14. 12 0
      src/main/java/com/example/demo/model/dify/GenerateInstructVO.java
  15. 9 0
      src/main/java/com/example/demo/model/dify/GenerateTechnicalVO.java
  16. 19 0
      src/main/java/com/example/demo/model/dify/OAMessageDTO.java
  17. 20 0
      src/main/java/com/example/demo/model/dify/confessionSession/AddConfessionSessionDTO.java
  18. 11 0
      src/main/java/com/example/demo/model/dify/confessionSession/AddConfessionSessionFileDTO.java
  19. 10 0
      src/main/java/com/example/demo/model/dify/confessionSession/DeleteConfessionSessionDTO.java
  20. 11 0
      src/main/java/com/example/demo/model/dify/confessionSession/QueryConfessionSessionDTO.java
  21. 11 0
      src/main/java/com/example/demo/model/dify/confessionSession/UpdateConfessionSessionDTO.java
  22. 15 0
      src/main/java/com/example/demo/model/poi/PoiRemarkVO.java
  23. 17 0
      src/main/java/com/example/demo/model/poi/PoiWordRunVO.java
  24. 40 1
      src/main/java/com/example/demo/service/DifyService.java
  25. 1 1
      src/main/java/com/example/demo/service/NoveltyAiService.java
  26. 54 0
      src/main/java/com/example/demo/service/OutAPiService.java
  27. 52 0
      src/main/java/com/example/demo/service/WordService.java
  28. 54 0
      src/main/java/com/example/demo/service/getFileText/GetFileTextService.java
  29. 386 0
      src/main/java/com/example/demo/service/patentCheckService/POIService.java
  30. 26 0
      src/main/java/com/example/demo/utils/FileUtils.java
  31. 563 0
      src/main/java/com/example/demo/utils/StringUtils.java
  32. 1 1
      src/main/resources/application-dev.yml
  33. 1 1
      src/main/resources/application.yml
  34. 45 2
      src/test/java/com/example/demo/ExcelServiceTests.java

+ 82 - 0
pom.xml

@@ -31,6 +31,11 @@
         <google.code.gson.version>2.7</google.code.gson.version>
         <google.code.gson.version>2.7</google.code.gson.version>
         <okhttps.version>4.10.0</okhttps.version>
         <okhttps.version>4.10.0</okhttps.version>
         <fastjson.version>2.0.12</fastjson.version>
         <fastjson.version>2.0.12</fastjson.version>
+        <poi.version>5.2.5</poi.version>
+        <mybatisplus.version>3.5.3.1</mybatisplus.version>
+        <druid.version>1.1.20</druid.version>
+        <hutool.version>5.6.5</hutool.version>
+        <poi-tl.version>1.10.3</poi-tl.version>
     </properties>
     </properties>
     <dependencies>
     <dependencies>
         <dependency>
         <dependency>
@@ -96,6 +101,83 @@
             <artifactId>okhttp</artifactId>
             <artifactId>okhttp</artifactId>
             <version>3.14.9</version>
             <version>3.14.9</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis-typehandlers-jsr310</artifactId>
+            <version>1.0.2</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>mybatis-plus-boot-starter</artifactId>-->
+<!--            <version>${mybatisplus.version}</version>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <version>3.5.11</version> <!-- 必须使用3.5.x版本 -->
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>${hutool.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.draco1023</groupId>
+            <artifactId>poi-tl-ext</artifactId>
+            <version>0.4.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>${poi-tl.version}</version>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 5 - 0
src/main/java/com/example/demo/config/Contents.java

@@ -0,0 +1,5 @@
+package com.example.demo.config;
+
+public class Contents {
+    public static final String TOOLS="tools";
+}

+ 27 - 0
src/main/java/com/example/demo/controller/GetFileTextController.java

@@ -0,0 +1,27 @@
+package com.example.demo.controller;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.example.demo.config.Contents;
+import com.example.demo.model.common.DifyHistoryMessageDTO;
+import com.example.demo.model.common.Response;
+import com.example.demo.service.getFileText.GetFileTextService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+@RequestMapping(Contents.TOOLS+"/getFileText")
+@RestController
+public class GetFileTextController {
+    @Autowired
+    private GetFileTextService getFileTextService;
+    @RequestMapping(value = "/getFileText", method = RequestMethod.POST)
+    public String getFileText( MultipartFile files) throws Exception {
+         String text= getFileTextService.getFileText(files);
+        return text;
+    }
+}

+ 0 - 1
src/main/java/com/example/demo/controller/NoveltyController.java

@@ -15,7 +15,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Flux;
 
 
-import java.io.File;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;

+ 36 - 0
src/main/java/com/example/demo/controller/PatentFileCheckController.java

@@ -0,0 +1,36 @@
+package com.example.demo.controller;
+
+import com.example.demo.config.Contents;
+import com.example.demo.service.getFileText.GetFileTextService;
+import com.example.demo.service.patentCheckService.POIService;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+@RequestMapping(Contents.TOOLS + "/patentFileCheck")
+@RestController
+public class PatentFileCheckController {
+    @Autowired
+    private GetFileTextService getFileTextService;
+    @Autowired
+    private POIService poiService;
+
+    @RequestMapping(value = "/getCheckFile", method = RequestMethod.POST)
+    public ResponseEntity<InputStreamResource> addConfessionSession(MultipartFile file) throws Exception {
+        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
+        HttpServletRequest httpRequest = sra.getRequest();
+        String a = httpRequest.getHeader("Content-Type");
+        System.out.println(a);
+        return poiService.exportCheckFile(file);
+    }
+
+}

+ 11 - 0
src/main/java/com/example/demo/model/dify/ChatMessageDTO.java

@@ -0,0 +1,11 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+@Data
+public class ChatMessageDTO {
+    private String query;
+    private String conversationId;
+    private Integer projectId;
+    private Integer confessionSessionId;
+}

+ 10 - 0
src/main/java/com/example/demo/model/dify/ClaimExplainVO.java

@@ -0,0 +1,10 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+@Data
+public class ClaimExplainVO {
+    private String explain;
+    private String effects;
+    private String claim;
+}

+ 4 - 3
src/main/java/com/example/demo/model/DifyChatMessageDTO.java

@@ -1,5 +1,6 @@
-package com.example.demo.model;
+package com.example.demo.model.dify;
 
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -13,9 +14,9 @@ public class DifyChatMessageDTO {
     private String responseMode;
     private String responseMode;
     @SerializedName("conversation_id")
     @SerializedName("conversation_id")
     private String conversationId;
     private String conversationId;
-    @SerializedName("user")
+    @JsonProperty("user")
     private String user;
     private String user;
 
 
     private Map<String,Object> inputs;
     private Map<String,Object> inputs;
     private List<DifyFile> files;
     private List<DifyFile> files;
-}
+}

+ 3 - 2
src/main/java/com/example/demo/model/DifyFile.java

@@ -1,5 +1,6 @@
-package com.example.demo.model;
+package com.example.demo.model.dify;
 
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -10,6 +11,6 @@ public class DifyFile {
     @SerializedName("transfer_method")
     @SerializedName("transfer_method")
     private String transferMethod;
     private String transferMethod;
     private String url;
     private String url;
-    @SerializedName("upload_file_id")
+    @JsonProperty("upload_file_id")
     private String uploadFileId;
     private String uploadFileId;
 }
 }

+ 11 - 0
src/main/java/com/example/demo/model/dify/DifyHistoryMessageDTO.java

@@ -0,0 +1,11 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+@Data
+public class DifyHistoryMessageDTO {
+    private String conversationId;
+    private String user;
+    private String firstId;
+    private Integer limit;
+}

+ 11 - 0
src/main/java/com/example/demo/model/dify/FluxMessageVO.java

@@ -0,0 +1,11 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+@Data
+public class FluxMessageVO {
+    private String event;
+    private String field;
+    private String content;
+    private Integer id;
+}

+ 9 - 0
src/main/java/com/example/demo/model/dify/GenerateClaimDTO.java

@@ -0,0 +1,9 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+@Data
+public class GenerateClaimDTO {
+    private String claim;
+    private String background;
+}

+ 16 - 0
src/main/java/com/example/demo/model/dify/GenerateInstructAnswerVO.java

@@ -0,0 +1,16 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GenerateInstructAnswerVO {
+    private String answer;
+    private String conversionId;
+    private ClaimExplainVO claimExplainVO;
+    private String title;
+    private String technical;
+    private List<String> implementations;
+    private List<String> answers;
+}

+ 12 - 0
src/main/java/com/example/demo/model/dify/GenerateInstructVO.java

@@ -0,0 +1,12 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GenerateInstructVO {
+    private List<ClaimExplainVO> claimExplains;
+    private GenerateTechnicalVO technical;
+    private String conversionId ;
+}

+ 9 - 0
src/main/java/com/example/demo/model/dify/GenerateTechnicalVO.java

@@ -0,0 +1,9 @@
+package com.example.demo.model.dify;
+
+import lombok.Data;
+
+@Data
+public class GenerateTechnicalVO {
+    private String technical;
+    public  String title;
+}

+ 19 - 0
src/main/java/com/example/demo/model/dify/OAMessageDTO.java

@@ -0,0 +1,19 @@
+package com.example.demo.model.dify;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class OAMessageDTO {
+    @SerializedName("response_mode")
+    private String responseMode;
+    @JsonProperty("user")
+    private String user;
+
+    private Map<String,Object> inputs;
+    private List<DifyFile> files;
+}

+ 20 - 0
src/main/java/com/example/demo/model/dify/confessionSession/AddConfessionSessionDTO.java

@@ -0,0 +1,20 @@
+package com.example.demo.model.dify.confessionSession;
+
+import lombok.Data;
+
+@Data
+public class AddConfessionSessionDTO {
+    private String fileGuid;
+
+    private String conversationId;
+
+    private String conversationName;
+
+    private String inventionPoint;
+    private String content;
+    private String createId;
+
+    private String guid;
+
+    private Integer type;
+}

+ 11 - 0
src/main/java/com/example/demo/model/dify/confessionSession/AddConfessionSessionFileDTO.java

@@ -0,0 +1,11 @@
+package com.example.demo.model.dify.confessionSession;
+
+import lombok.Data;
+
+@Data
+public class AddConfessionSessionFileDTO {
+
+    private Integer confessionSessionId;
+
+    private String guid;
+}

+ 10 - 0
src/main/java/com/example/demo/model/dify/confessionSession/DeleteConfessionSessionDTO.java

@@ -0,0 +1,10 @@
+package com.example.demo.model.dify.confessionSession;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeleteConfessionSessionDTO {
+    private List<Integer> confessionSessionIds ;
+}

+ 11 - 0
src/main/java/com/example/demo/model/dify/confessionSession/QueryConfessionSessionDTO.java

@@ -0,0 +1,11 @@
+package com.example.demo.model.dify.confessionSession;
+
+import lombok.Data;
+
+@Data
+public class QueryConfessionSessionDTO {
+    private Integer confessionSessionId;
+    private long current;
+    private long size;
+    private Integer type;
+}

+ 11 - 0
src/main/java/com/example/demo/model/dify/confessionSession/UpdateConfessionSessionDTO.java

@@ -0,0 +1,11 @@
+package com.example.demo.model.dify.confessionSession;
+
+import lombok.Data;
+
+@Data
+public class UpdateConfessionSessionDTO {
+    private Integer confessionSessionId;
+    private String inventionPoint;
+    private String conversationName;
+    private String conversationId;
+}

+ 15 - 0
src/main/java/com/example/demo/model/poi/PoiRemarkVO.java

@@ -0,0 +1,15 @@
+package com.example.demo.model.poi;
+
+import lombok.Data;
+
+import java.math.BigInteger;
+
+@Data
+public class PoiRemarkVO {
+    private BigInteger commentId;
+    private Integer index;
+    private String trueContent;
+    private Integer remarkType;
+    private String type;
+    private String reason;
+}

+ 17 - 0
src/main/java/com/example/demo/model/poi/PoiWordRunVO.java

@@ -0,0 +1,17 @@
+package com.example.demo.model.poi;
+
+import lombok.Data;
+
+@Data
+public class PoiWordRunVO {
+    private Integer index;
+
+    private Integer lastIndex;
+    private String content;//原文内容
+
+    private String trueContent;
+
+    private Boolean ifRemark;
+    private String type;
+    private String reason;
+}

+ 40 - 1
src/main/java/com/example/demo/service/DifyService.java

@@ -3,10 +3,10 @@ package com.example.demo.service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
-import com.example.demo.model.DifyChatMessageDTO;
 import com.example.demo.model.DifyGetNumVO;
 import com.example.demo.model.DifyGetNumVO;
 import com.example.demo.model.common.ChatMessageDTO;
 import com.example.demo.model.common.ChatMessageDTO;
 import com.example.demo.model.common.DifyHistoryMessageDTO;
 import com.example.demo.model.common.DifyHistoryMessageDTO;
+import com.example.demo.model.dify.DifyChatMessageDTO;
 import com.google.gson.Gson;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonArray;
 import okhttp3.*;
 import okhttp3.*;
@@ -28,6 +28,8 @@ public class DifyService {
     private  final     String apiKey="app-ekzGTtvRnSq2aSqwZqKG5EH3";
     private  final     String apiKey="app-ekzGTtvRnSq2aSqwZqKG5EH3";
     @Value("${FileDownloadUrl}")
     @Value("${FileDownloadUrl}")
     private String filePath;
     private String filePath;
+    @Value("${DIFY.checkApiKey}")
+    private String checkApiKey;
     public String chatMessage(DifyChatMessageDTO difyChatMessageDTO, String key) throws IOException {
     public String chatMessage(DifyChatMessageDTO difyChatMessageDTO, String key) throws IOException {
         String url = "http://192.168.2.24/v1/";
         String url = "http://192.168.2.24/v1/";
         String param = new Gson().toJson(difyChatMessageDTO);
         String param = new Gson().toJson(difyChatMessageDTO);
@@ -228,4 +230,41 @@ public class DifyService {
                 .build();
                 .build();
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
     }
+    /**
+     * 调用质检
+     */
+    public String WordErrorWorkFlow(DifyChatMessageDTO difyChatMessageDTO) throws IOException {
+        String param = new Gson().toJson(difyChatMessageDTO);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(600, TimeUnit.SECONDS)
+                .writeTimeout(600, TimeUnit.SECONDS)
+                .readTimeout(600, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(url + "workflows/run")
+                .post(requestBody)
+                .addHeader("Authorization", "Bearer " + checkApiKey)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+    /**
+     * 调用质检
+     */
+    public String GetKeyWord(DifyChatMessageDTO difyChatMessageDTO) throws IOException {
+        String param = new Gson().toJson(difyChatMessageDTO);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(600, TimeUnit.SECONDS)
+                .writeTimeout(600, TimeUnit.SECONDS)
+                .readTimeout(600, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(url + "workflows/run")
+                .post(requestBody)
+                .addHeader("Authorization", "Bearer " + checkApiKey)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
 }
 }

+ 1 - 1
src/main/java/com/example/demo/service/NoveltyAiService.java

@@ -3,9 +3,9 @@ package com.example.demo.service;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.example.demo.domain.Project;
 import com.example.demo.domain.Project;
-import com.example.demo.model.DifyChatMessageDTO;
 import com.example.demo.model.GetNoveltyMessageDTO;
 import com.example.demo.model.GetNoveltyMessageDTO;
 import com.example.demo.model.GetNoveltyMessageVO;
 import com.example.demo.model.GetNoveltyMessageVO;
+import com.example.demo.model.dify.DifyChatMessageDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;

+ 54 - 0
src/main/java/com/example/demo/service/OutAPiService.java

@@ -0,0 +1,54 @@
+package com.example.demo.service;
+
+import okhttp3.*;
+import org.apache.commons.io.FileUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import static cn.hutool.core.io.FileUtil.getMimeType;
+
+@Service
+public class OutAPiService {
+    private String unstructedUrl="http://192.168.2.24:9500";
+    public String getFileContent(List<MultipartFile> multipartFiles) throws IOException {
+        List<File> files = new ArrayList<>();
+        for (MultipartFile multipartFile : multipartFiles) {
+            File file = new File(multipartFile.getOriginalFilename());
+            FileCopyUtils.copy(multipartFile.getBytes(), file);
+            files.add(file);
+        }
+        MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder()
+                .setType(MultipartBody.FORM);
+        for (File file : files) {
+            //根据文件名获取文件的MIME类型
+            String mimeType = getMimeType(file.getPath());
+            multipartBodyBuilder.addFormDataPart("files", file.getName(), RequestBody.create(MediaType.parse(mimeType), file));
+        }
+        RequestBody requestBody = multipartBodyBuilder
+                .build();
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(unstructedUrl + "/general/v0/general")
+                .post(requestBody)
+                .build();
+        Response response = null;
+        response = okHttpClient.newCall(request).execute();
+        // 最后记得删除临时文件
+        for (File file : files) {
+            FileUtils.deleteQuietly(file);
+        }
+        return Objects.requireNonNull(response.body()).string();
+    }
+}

+ 52 - 0
src/main/java/com/example/demo/service/WordService.java

@@ -0,0 +1,52 @@
+package com.example.demo.service;
+
+import org.apache.poi.hwpf.extractor.WordExtractor;
+import org.apache.poi.xwpf.usermodel.XWPFComment;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.List;
+
+@Service
+public class WordService {
+    public String getDocxComments(MultipartFile multipartFile) {
+        StringBuilder stringBuilder = new StringBuilder();
+        try (InputStream fis = multipartFile.getInputStream();
+             XWPFDocument document = new XWPFDocument(fis)) {
+
+            // 获取文档中的所有批注
+            XWPFComment[] comments = document.getComments();
+            for (XWPFComment comment : comments) {
+                // 提取批注信息
+                String author = comment.getAuthor();
+                String text = comment.getText(); // 获取批注文本内容
+                String id = comment.getId(); // 获取批注ID
+                stringBuilder.append(text);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return stringBuilder.toString();
+    }
+
+    public String getDocComments(MultipartFile multipartFile) {
+        StringBuilder stringBuilder = new StringBuilder();
+        try (InputStream fis = multipartFile.getInputStream();
+             WordExtractor extractor = new WordExtractor(fis)) {
+
+            // 尝试提取批注文本
+            String[] comments = extractor.getCommentsText();
+            if (comments != null) {
+                for (String comment : comments) {
+                    stringBuilder.append(comment);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return stringBuilder.toString();
+    }
+}

+ 54 - 0
src/main/java/com/example/demo/service/getFileText/GetFileTextService.java

@@ -0,0 +1,54 @@
+package com.example.demo.service.getFileText;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.example.demo.service.OutAPiService;
+import com.example.demo.service.WordService;
+import com.example.demo.utils.FileUtils;
+import com.google.gson.JsonObject;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Service
+public class GetFileTextService {
+    @Autowired
+    private OutAPiService outAPiService;
+    @Autowired
+    private WordService wordService;
+
+    public String getMainBodyText(MultipartFile multipartFile) throws Exception {
+        String resBody = outAPiService.getFileContent(Arrays.asList(multipartFile));
+        List<JSONObject> jsonObjects = JSONArray.parseArray(resBody);
+        StringBuilder stringBuilder = new StringBuilder();
+        jsonObjects.forEach(item -> {
+            stringBuilder.append(item.get("text").toString());
+        });
+        return stringBuilder.toString();
+    }
+
+    public String getFileText(MultipartFile multipartFile) throws Exception {
+        String bodyText = this.getMainBodyText(multipartFile);
+        String orgName = multipartFile.getOriginalFilename();
+        String fileType = FileUtils.getFileType(orgName);
+            String commentsText="";
+        switch (fileType) {
+            case "doc":
+                 commentsText = wordService.getDocComments(multipartFile);
+
+                break;
+            case "docx":
+                 commentsText = wordService.getDocxComments(multipartFile);
+
+                break;
+        }
+        if(commentsText!=null&&!commentsText.trim().equals("")) {
+            bodyText = bodyText + "\n批注内容:" + commentsText;
+        }
+        return bodyText;
+    }
+}

File diff suppressed because it is too large
+ 386 - 0
src/main/java/com/example/demo/service/patentCheckService/POIService.java


+ 26 - 0
src/main/java/com/example/demo/utils/FileUtils.java

@@ -0,0 +1,26 @@
+package com.example.demo.utils;
+
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.tomcat.util.http.fileupload.FileItem;
+import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class FileUtils {
+    public static MultipartFile getMultipartFile(File file) throws Exception {
+        FileInputStream fileInputStream = new FileInputStream(file);
+        MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(),
+                "application/octet-stream", fileInputStream);
+        return multipartFile;
+    }
+    public static String getFileType(String name){
+       Integer i= name.lastIndexOf(".");
+       String type =name.substring(i+1,name.length());
+       return type;
+    }
+}

+ 563 - 0
src/main/java/com/example/demo/utils/StringUtils.java

@@ -0,0 +1,563 @@
+package com.example.demo.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+@Slf4j
+public class StringUtils {
+
+    private final static int NUM_32 = 32;
+    //集群号
+    private static int machineId = 1;
+    /**
+     * 下划线
+     */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 下划线转驼峰命名
+     */
+    public static String toUnderScoreCase(String str) {
+        if (str == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++) {
+            char c = str.charAt(i);
+            if (i > 0) {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            } else {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1)) {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
+                sb.append(SEPARATOR);
+            } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     *
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object) {
+        return !isNull(object);
+    }
+
+    public static boolean isNull(Object object) {
+        return object == null;
+    }
+
+
+    /**
+     * 把String 转换为 long
+     *
+     * @param str
+     * @param defaultData
+     * @return
+     */
+    public static long getLong(String str, Long defaultData) {
+        Long lnum = defaultData;
+
+        if (isEmpty(str)) {
+            return lnum;
+        }
+        try {
+            lnum = Long.valueOf(str.trim()).longValue();
+        } catch (NumberFormatException e) {
+            log.warn("把String 转换为 long======== " + str);
+        }
+        return lnum;
+
+    }
+
+    /**
+     * 转换成Boolean类型
+     *
+     * @param str
+     * @param defaultData
+     * @return
+     */
+    public static Boolean getBoolean(String str, Boolean defaultData) {
+        Boolean lnum = defaultData;
+
+        if (isEmpty(str)) {
+            return lnum;
+        }
+        try {
+            lnum = Boolean.valueOf(str.trim()).booleanValue();
+        } catch (NumberFormatException e) {
+            log.warn("把String 转换为 long======== " + str);
+        }
+        return lnum;
+
+    }
+
+    /**
+     * 把String转换成int数据
+     *
+     * @param str
+     * @param defaultData
+     * @return
+     */
+    public static int getInt(String str, Integer defaultData) {
+        int inum = defaultData;
+        if (isEmpty(str)) {
+            return inum;
+        }
+        try {
+            inum = Integer.valueOf(str.trim()).intValue();
+        } catch (NumberFormatException e) {
+            log.warn("把String转换成int数据========== " + str);
+        }
+        return inum;
+    }
+
+    /**
+     * 把String转换成double数据
+     *
+     * @param str
+     * @param defaultData
+     * @return
+     */
+    public static double getDouble(String str, Double defaultData) {
+        double dnum = defaultData;
+        if (isEmpty(str)) {
+            return dnum;
+        }
+        try {
+            dnum = Double.valueOf(str.trim()).doubleValue();
+        } catch (NumberFormatException e) {
+            log.error("把String转换成double数据: {}", str);
+        }
+        return dnum;
+    }
+
+    /**
+     * 把String转换成float数据
+     *
+     * @param str
+     * @param defaultData
+     * @return
+     */
+    public static float getFloat(String str, Float defaultData) {
+        float dnum = defaultData;
+        if (isEmpty(str)) {
+            return dnum;
+        }
+        try {
+            dnum = Float.valueOf(str.trim()).floatValue();
+        } catch (NumberFormatException e) {
+            log.error("把String转换成float数据: {}", str);
+        }
+        return dnum;
+    }
+
+    /**
+     * 判断字符串是否为空
+     *
+     * @param s
+     * @return
+     */
+    public static Boolean isEmpty(String s) {
+        if (s == null || s.length() <= 0) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 判断字符串是否为空
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isNotEmpty(String str) {
+        return !StringUtils.isEmpty(str);
+    }
+
+    /**
+     * 按code截取字符串
+     *
+     * @return
+     */
+    public static String[] split(String str, String code) {
+        String[] split;
+        if (isEmpty(str)) {
+            split = null;
+        } else {
+            split = str.split(code);
+        }
+        return split;
+    }
+
+    /**
+     * 把字符串按code 转换为List<Long>
+     *
+     * @param str
+     * @return
+     */
+    public static List<Long> changeStringToLong(String str, String code) {
+        String[] split = split(str, code);
+        List<Long> lnums = new ArrayList<>();
+        for (String s : split) {
+            if (!isEmpty(s)) {
+                long lnum = getLong(s, 0L);
+                lnums.add(lnum);
+            }
+
+        }
+        return lnums;
+    }
+
+    /**
+     * 把字符串按code 转换为List<String>
+     *
+     * @param str
+     * @return
+     */
+    public static List<String> changeStringToString(String str, String code) {
+        String[] split = split(str, code);
+        List<String> lnums = new ArrayList<>();
+        for (String s : split) {
+            String trim = s.trim();
+            lnums.add(trim);
+        }
+        return lnums;
+    }
+
+    /**
+     * 把字符串按code 转换为List<Long>
+     *
+     * @param str
+     * @return
+     */
+    public static List<Integer> changeStringToInteger(String str, String code) {
+        if (isEmpty(str)) {
+            return new ArrayList<>();
+        }
+        String[] split = split(str, code);
+        List<Integer> inums = new ArrayList<>();
+        for (String s : split) {
+            int inum = getInt(s, 0);
+            inums.add(inum);
+        }
+        return inums;
+    }
+
+
+    /**
+     * 生成唯一订单号
+     *
+     * @return
+     */
+    public static String getOrderNumberByUUID() {
+
+        int hashCodeV = UUID.randomUUID().toString().hashCode();
+        //有可能是负数
+        if (hashCodeV < 0) {
+            hashCodeV = -hashCodeV;
+        }
+        String orderNumber = machineId + String.format("%015d", hashCodeV);
+        return orderNumber;
+    }
+
+    /**
+     * 生成唯一商户退款单号
+     *
+     * @return
+     */
+    public static String getOutRefundNoByUUID() {
+
+        int hashCodeV = UUID.randomUUID().toString().hashCode();
+        //有可能是负数
+        if (hashCodeV < 0) {
+            hashCodeV = -hashCodeV;
+        }
+        String out_refund_no = "BACK" + machineId + String.format("%015d", hashCodeV);
+        return out_refund_no;
+
+    }
+
+    /**
+     * 获取UUID,去掉了-
+     *
+     * @return
+     */
+    public static String getUUID() {
+        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+        log.debug("获取32位的UUID的调试日志-->>" + uuid);
+        return uuid;
+    }
+
+    /**
+     * 获取雪花UID
+     *
+     * @return
+     */
+//    public static Long getSnowflakeId() {
+//        SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(0, 0);
+//        return snowflakeIdWorker.nextId();
+//    }
+
+    /**
+     * list小于0的数据就过滤了
+     * 把list的数组变成1,3,4,5,6
+     *
+     * @param list
+     * @param code
+     * @return
+     */
+    public static String listToString(List<Long> list, String code) {
+        String s = "";
+        if (list == null || list.size() <= 0) {
+            return s;
+        }
+        for (Long l : list) {
+            if (l.longValue() > 0) {
+                s = s + l + code;
+            }
+        }
+        return s;
+    }
+
+    /**
+     * 按code把list的数组转换成字符串
+     *
+     * @param list
+     * @param code
+     * @return
+     */
+    public static String listTranformString(List<String> list, String code) {
+        String s = "";
+        if (list == null || list.size() <= 0) {
+            return s;
+        }
+        s = String.join(code, list);
+        return s;
+    }
+
+    /**
+     * 判断是否为非空字符串
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isNotBlank(String str) {
+        return !StringUtils.isBlank(str);
+    }
+
+    /**
+     * 校验uid列表,检查里面元素是否满足限定长度为32
+     *
+     * @param collection
+     * @return
+     */
+    public static boolean checkUidList(Collection<String> collection) {
+        if (collection.size() == 0) {
+            return false;
+        }
+        for (String uid : collection) {
+            if (uid.trim().length() != NUM_32) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 判断是否为空字符串
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isBlank(String str) {
+        int strLen;
+        if (str == null || (strLen = str.length()) == 0) {
+            return true;
+        }
+        for (int i = 0; i < strLen; i++) {
+            if ((Character.isWhitespace(str.charAt(i)) == false)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 判断一个字符串是否为数字
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isNumeric(String str) {
+        try {
+            //把字符串强制转换为数字
+            Integer.valueOf(str);
+            //如果是数字,返回True
+            return true;
+        } catch (Exception e) {
+            //如果抛出异常,返回False
+            return false;
+        }
+    }
+
+    /**
+     * 判断是不是整数数字
+     * @param s
+     * @return
+     */
+    public static boolean isInteger(String s) {
+        if (s == null) {
+            return false;
+        }
+        return s.matches("-?\\d+"); // 匹配整数,包括负数
+    }
+
+    /**
+     * 判断是不是正整数数字
+     * @param s
+     * @return
+     */
+    public static boolean isPositiveInteger(String s) {
+        if (s == null) {
+            return false;
+        }
+        // 正则表达式匹配一个或多个正整数
+        return s.matches("\\d+"); // "\\d+" 匹配一个或多个数字,但不包括负数和小数点
+    }
+
+    /**
+     * 某个子串是否在字符串内
+     *
+     * @param str
+     * @param searchChar
+     * @return
+     */
+    public static boolean contains(String str, String searchChar) {
+        if (isEmpty(str)) {
+            return false;
+        }
+        return str.indexOf(searchChar) >= 0;
+    }
+
+    /**
+     * 切割字符串
+     *
+     * @param str
+     * @param start
+     * @return
+     */
+    public static String substring(String str, int start) {
+        if (str == null) {
+            return null;
+        }
+        // handle negatives, which means last n characters
+        if (start < 0) {
+            start = str.length() + start;
+        }
+        if (start < 0) {
+            start = 0;
+        }
+        if (start > str.length()) {
+            return "";
+        }
+        return str.substring(start);
+    }
+
+    /**
+     * 判断评论是否为垃圾评论(仅通过单一字符重复出现来判断,以后可以扩展更多的检测方法)
+     *
+     * @param content
+     * @return
+     */
+    public static Boolean isCommentSpam(String content) {
+        if (content == null) {
+            return true;
+        }
+        char[] chars = content.toCharArray();
+        // 最大重复次数
+        Integer maxCount = 4;
+        for (int a = 0; a < chars.length; a++) {
+            Integer count = 1;
+            for (int b = a; b < chars.length - 1; b++) {
+                if (chars[b + 1] == chars[b]) {
+                    count++;
+                    // 判断字符重复的次数是否大于阈值
+                    if (count >= maxCount) {
+                        return true;
+                    }
+                    continue;
+                } else {
+                    break;
+                }
+            }
+        }
+        return false;
+    }
+
+    public static <T> String join(List<T> list, String separator) {
+        return org.apache.commons.lang3.StringUtils.join(list, separator);
+    }
+
+    public static <T> String join(String[] list, String separator) {
+        return org.apache.commons.lang3.StringUtils.join(list, separator);
+    }
+
+
+    public static List<String> splitChineseText(String text,Integer textNum) {
+        List<String> chunks = new ArrayList<>();
+        int start = 0;
+        int textLength = text.length();
+        if (text.length() < textNum) {
+            chunks.add(text);
+            return chunks;
+        }
+        while (start < textLength) {
+            // 计算当前块的最大可能结束位置
+            int end = Math.min(start + textNum, textLength);
+            int lastSentenceEnd = -1;
+
+            // 从后向前查找最后一个句号
+            for (int i = end - 1; i >= start; i--) {
+                if (text.charAt(i) == '。') {
+                    lastSentenceEnd = i;
+                    break;
+                }
+            }
+
+            if (lastSentenceEnd != -1) {
+                // 切割文本并添加到结果集
+                chunks.add(text.substring(start, lastSentenceEnd + 1));
+                start = lastSentenceEnd + 1;
+            } else {
+                // 异常处理:当前2000字符范围内没有句号
+                throw new RuntimeException("文本位置 " + start + " 至 " + end + " 之间未找到句号,请检查输入文本格式");
+            }
+        }
+        return chunks;
+    }
+}

+ 1 - 1
src/main/resources/application-dev.yml

@@ -59,7 +59,7 @@ DIFY:
   apiKey: app-DDGJt4QUmzlc2aFQ5voOAXIj
   apiKey: app-DDGJt4QUmzlc2aFQ5voOAXIj
 #  cliamKey: app-fxpiWOYqtJM1BOaJnG54NlCZ
 #  cliamKey: app-fxpiWOYqtJM1BOaJnG54NlCZ
   OAApiKey: app-NvKwdHvEK2UmJdmjTGDR0xu6
   OAApiKey: app-NvKwdHvEK2UmJdmjTGDR0xu6
-  checkApiKey: aa
+  checkApiKey: app-lrLVnigc6GPyJPMLmaqX22BO
   cliamKey: app-jF3akhYKgljPLdpeIpTNbs6f
   cliamKey: app-jF3akhYKgljPLdpeIpTNbs6f
   gInstructionKey: app-7ImBmlr7kvBTSvBj1mTvgKyp
   gInstructionKey: app-7ImBmlr7kvBTSvBj1mTvgKyp
   url: http://192.168.2.24/v1/
   url: http://192.168.2.24/v1/

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

@@ -1,7 +1,7 @@
 server:
 server:
   servlet:
   servlet:
     context-path: /
     context-path: /
-  port: 8071
+  port: 7777
 #  sa-token:
 #  sa-token:
 #  activity-timeout: 18000
 #  activity-timeout: 18000
 #  token-name: token
 #  token-name: token

+ 45 - 2
src/test/java/com/example/demo/ExcelServiceTests.java

@@ -3,6 +3,8 @@ package com.example.demo;
 import com.example.demo.model.PictureNumVO;
 import com.example.demo.model.PictureNumVO;
 import com.example.demo.model.PicturePositionVO;
 import com.example.demo.model.PicturePositionVO;
 import com.example.demo.service.*;
 import com.example.demo.service.*;
+import com.example.demo.service.getFileText.GetFileTextService;
+import com.example.demo.utils.FileUtils;
 import net.sourceforge.tess4j.ITesseract;
 import net.sourceforge.tess4j.ITesseract;
 import net.sourceforge.tess4j.Tesseract;
 import net.sourceforge.tess4j.Tesseract;
 import net.sourceforge.tess4j.Word;
 import net.sourceforge.tess4j.Word;
@@ -15,11 +17,13 @@ import org.bytedeco.opencv.opencv_core.Scalar;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.File;
+import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
 import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
 import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
@@ -36,10 +40,49 @@ class ExcelServiceTests {
     private DifyService difyService;
     private DifyService difyService;
     @Autowired
     @Autowired
     private ExcelService excelService;
     private ExcelService excelService;
+    @Autowired
+    private WordService wordService;
+    @Autowired
+    private OutAPiService outAPiService;
+    @Autowired
+    private GetFileTextService getFileTextService;
 
 
     @Test
     @Test
     public void test() throws Exception {
     public void test() throws Exception {
-        excelService.test();
-        System.out.println("a");
+        // wordService.getWordContent2("E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250926-生成技术交底书理解结果-lrj-v1\\新建文件夹\\250312-2025P80627-PACN2511533-用于共享单车座椅的一次性保护装置-新申请文档-v1F.doc");
+//        wordService.getWordContent("E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250926-生成技术交底书理解结果-lrj-v1\\新建文件夹\\250401-HKC242381CN1-PACN24110532-一种GDL异常修补方式-申请文件-v1F.docx");
+
+    }
+
+    @Test
+    public void getFileContent() throws Exception {
+        File file = new File("E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250926-生成技术交底书理解结果-lrj-v1\\新建文件夹\\250312-2025P80627-PACN2511533-用于共享单车座椅的一次性保护装置-新申请文档-v1F.doc");
+        MultipartFile multipartFile = FileUtils.getMultipartFile(file);
+        String a = outAPiService.getFileContent(Arrays.asList(multipartFile));
+        System.out.println(a);
+    }
+
+    @Test
+    public void getFileText() throws Exception {
+        File file = new File("E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250926-生成技术交底书理解结果-lrj-v1\\新建文件夹\\250312-2025P80627-PACN2511533-用于共享单车座椅的一次性保护装置-新申请文档-v1F.doc");
+        MultipartFile multipartFile = FileUtils.getMultipartFile(file);
+        String text = getFileTextService.getMainBodyText(multipartFile);
+        System.out.println(text);
+    }
+
+    @Test
+    public void getFileText2() throws Exception {
+        File file = new File("E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250926-生成技术交底书理解结果-lrj-v1\\新建文件夹\\250312-2025P80627-PACN2511533-用于共享单车座椅的一次性保护装置-新申请文档-v1F.doc");
+        MultipartFile multipartFile = FileUtils.getMultipartFile(file);
+        String name = multipartFile.getName();
+      String text=  FileUtils.getFileType(name);
+        System.out.println(text);
+    }
+    @Test
+    public void getFileText3() throws Exception {
+        File file = new File("E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250926-生成技术交底书理解结果-lrj-v1\\新建文件夹\\250312-2025P80627-PACN2511533-用于共享单车座椅的一次性保护装置-新申请文档-v1F.doc");
+        MultipartFile multipartFile = FileUtils.getMultipartFile(file);
+       String text=getFileTextService.getFileText(multipartFile);
+        System.out.println(text);
     }
     }
 }
 }