ソースを参照

update parseDoc api

deason 1 ヶ月 前
コミット
5dd23a4edc

+ 35 - 0
src/main/java/com/qmth/ops/api/controller/ai/DocController.java

@@ -0,0 +1,35 @@
+package com.qmth.ops.api.controller.ai;
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.core.ai.model.AiConstants;
+import com.qmth.boot.core.ai.model.doc.ParseDocTask;
+import com.qmth.boot.core.ai.model.doc.ParseDocTaskResult;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.ops.api.security.AccessOrg;
+import com.qmth.ops.biz.service.DocClientService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+@RestController
+@Aac(auth = true, signType = SignatureType.SECRET)
+public class DocController {
+
+    @Resource
+    private DocClientService docClientService;
+
+    @PostMapping(AiConstants.DOC_PARSE_TASK_PATH)
+    public ParseDocTask parseDocTask(@RequestAttribute AccessOrg accessOrg, @RequestParam("file") MultipartFile file) throws Exception {
+        return docClientService.parseDocTask(file.getBytes(), file.getOriginalFilename());
+    }
+
+    @PostMapping(AiConstants.DOC_PARSE_TASK_QUERY_PATH)
+    public ParseDocTaskResult parseDocTaskQuery(@RequestAttribute AccessOrg accessOrg, @RequestParam("taskId") String taskId) throws Exception {
+        return docClientService.parseDocTaskQuery(taskId);
+    }
+
+}

+ 0 - 12
src/main/java/com/qmth/ops/api/controller/ai/OcrController.java

@@ -4,8 +4,6 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.core.ai.model.AiConstants;
 import com.qmth.boot.core.ai.model.ocr.ImageType;
 import com.qmth.boot.core.ai.model.ocr.OcrType;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTask;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTaskResult;
 import com.qmth.boot.tools.signature.SignatureType;
 import com.qmth.ops.api.security.AccessOrg;
 import com.qmth.ops.biz.service.OcrClientService;
@@ -31,14 +29,4 @@ public class OcrController {
         return ocrClientService.forImage(type, file.getBytes(), imageType);
     }
 
-    @PostMapping(AiConstants.OCR_DOC_TASK_PATH)
-    public ParseDocTask parseDocTask(@RequestAttribute AccessOrg accessOrg, @RequestParam("file") MultipartFile file) throws Exception {
-        return ocrClientService.parseDocTask(file.getBytes(), file.getOriginalFilename());
-    }
-
-    @PostMapping(AiConstants.OCR_DOC_TASK_QUERY_PATH)
-    public ParseDocTaskResult parseDocTaskQuery(@RequestAttribute AccessOrg accessOrg, @RequestParam("taskId") String taskId) throws Exception {
-        return ocrClientService.parseDocTaskQuery(taskId);
-    }
-
 }

+ 5 - 5
src/main/java/com/qmth/ops/biz/ai/client/DocApiClient.java

@@ -1,7 +1,7 @@
 package com.qmth.ops.biz.ai.client;
 
-import com.qmth.boot.core.ai.model.ocr.ParseDocTask;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTaskResult;
+import com.qmth.boot.core.ai.model.doc.ParseDocTask;
+import com.qmth.boot.core.ai.model.doc.ParseDocTaskResult;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.core.rateLimit.service.RateLimiter;
 import com.qmth.boot.core.rateLimit.service.impl.MemoryRateLimiter;
@@ -18,13 +18,13 @@ public abstract class DocApiClient {
 
     private static final Logger log = LoggerFactory.getLogger(DocApiClient.class);
 
-    private final OcrApiConfig config;
+    private final DocApiConfig config;
 
     private final OkHttpClient client;
 
     private RateLimiter queryRateLimiter;
 
-    public DocApiClient(OcrApiConfig config) {
+    public DocApiClient(DocApiConfig config) {
         this.config = config;
 
         OkHttpClient.Builder builder = new OkHttpClient.Builder().connectionPool(new ConnectionPool())
@@ -44,7 +44,7 @@ public abstract class DocApiClient {
 
     public abstract ParseDocTaskResult parseDocTaskQuery(String taskId) throws Exception;
 
-    protected OcrApiConfig getConfig() {
+    protected DocApiConfig getConfig() {
         return config;
     }
 

+ 69 - 0
src/main/java/com/qmth/ops/biz/ai/client/DocApiConfig.java

@@ -0,0 +1,69 @@
+package com.qmth.ops.biz.ai.client;
+
+import com.qmth.ops.biz.domain.OcrSupplier;
+
+public class DocApiConfig {
+
+    private String url;
+
+    private String key;
+
+    private String secret;
+
+    private String supplier;
+
+    private int qps;
+
+    public DocApiConfig() {
+
+    }
+
+    public DocApiConfig(OcrSupplier supplier) {
+        this.url = supplier.getUrl();
+        this.key = supplier.getKey();
+        this.secret = supplier.getSecret();
+        this.qps = supplier.getQps();
+        this.supplier = String.valueOf(supplier.getId());
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+
+    public int getQps() {
+        return qps;
+    }
+
+    public void setQps(int qps) {
+        this.qps = qps;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+}

+ 10 - 9
src/main/java/com/qmth/ops/biz/ai/client/baidu/doc/BaiduParseDocClient.java

@@ -1,15 +1,15 @@
 package com.qmth.ops.biz.ai.client.baidu.doc;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTask;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTaskResult;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTaskStatus;
+import com.qmth.boot.core.ai.model.doc.ParseDocTask;
+import com.qmth.boot.core.ai.model.doc.ParseDocTaskResult;
+import com.qmth.boot.core.ai.model.doc.ParseDocTaskStatus;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.tools.codec.CodecUtils;
 import com.qmth.ops.biz.ai.client.DocApiClient;
-import com.qmth.ops.biz.ai.client.OcrApiConfig;
+import com.qmth.ops.biz.ai.client.DocApiConfig;
 import com.qmth.ops.biz.ai.client.baidu.BceV1Signer;
-import com.qmth.ops.biz.ai.exception.OcrRateLimitExceeded;
+import com.qmth.ops.biz.ai.exception.DocRateLimitExceeded;
 import okhttp3.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,14 +24,14 @@ public class BaiduParseDocClient extends DocApiClient {
 
     private static final Logger log = LoggerFactory.getLogger(BaiduParseDocClient.class);
 
-    public BaiduParseDocClient(OcrApiConfig config) {
+    public BaiduParseDocClient(DocApiConfig config) {
         super(config);
     }
 
     @Override
     public ParseDocTask parseDocTask(byte[] fileData, String fileName) throws Exception {
         if (getQueryRateLimiter() != null && !getQueryRateLimiter().acquire()) {
-            throw new OcrRateLimitExceeded(getConfig().getQps());
+            throw new DocRateLimitExceeded(getConfig().getQps());
         }
 
         FormBody.Builder formBuilder = new FormBody.Builder();
@@ -62,7 +62,7 @@ public class BaiduParseDocClient extends DocApiClient {
     @Override
     public ParseDocTaskResult parseDocTaskQuery(String taskId) throws Exception {
         if (getQueryRateLimiter() != null && !getQueryRateLimiter().acquire()) {
-            throw new OcrRateLimitExceeded(getConfig().getQps());
+            throw new DocRateLimitExceeded(getConfig().getQps());
         }
 
         FormBody.Builder formBuilder = new FormBody.Builder();
@@ -116,11 +116,12 @@ public class BaiduParseDocClient extends DocApiClient {
     }
 
     public static void main(String[] args) throws Exception {
-        OcrApiConfig config = new OcrApiConfig();
+        DocApiConfig config = new DocApiConfig();
         config.setUrl("https://aip.baidubce.com");
         config.setKey("xxx");
         config.setSecret("xxx");
         config.setQps(10);
+        config.setSupplier("3");
         DocApiClient client = new BaiduParseDocClient(config);
 
         // File file = new File("D:\\home\\大纲.pdf");

+ 17 - 0
src/main/java/com/qmth/ops/biz/ai/exception/DocClientNotFound.java

@@ -0,0 +1,17 @@
+package com.qmth.ops.biz.ai.exception;
+
+import com.qmth.boot.core.exception.NotFoundException;
+
+public class DocClientNotFound extends NotFoundException {
+
+    private static final long serialVersionUID = 6299687661502614806L;
+
+    public DocClientNotFound() {
+        super("Doc api client not found");
+    }
+
+    public DocClientNotFound(Long id) {
+        super("Doc api client not found for supplierId=" + id);
+    }
+
+}

+ 13 - 0
src/main/java/com/qmth/ops/biz/ai/exception/DocRateLimitExceeded.java

@@ -0,0 +1,13 @@
+package com.qmth.ops.biz.ai.exception;
+
+import com.qmth.boot.core.exception.ReentrantException;
+
+public class DocRateLimitExceeded extends ReentrantException {
+
+    private static final long serialVersionUID = 5439278820114982090L;
+
+    public DocRateLimitExceeded(int qps) {
+        super("Doc api rate limit exceeded, qps=" + qps);
+    }
+
+}

+ 76 - 0
src/main/java/com/qmth/ops/biz/service/DocClientService.java

@@ -0,0 +1,76 @@
+package com.qmth.ops.biz.service;
+
+import com.qmth.boot.core.ai.model.doc.ParseDocTask;
+import com.qmth.boot.core.ai.model.doc.ParseDocTaskResult;
+import com.qmth.ops.biz.ai.client.DocApiClient;
+import com.qmth.ops.biz.ai.client.DocApiConfig;
+import com.qmth.ops.biz.ai.exception.DocClientNotFound;
+import com.qmth.ops.biz.domain.OcrSupplier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DocClientService {
+
+    private static final Logger log = LoggerFactory.getLogger(DocClientService.class);
+
+    private DocApiClient defaultClient;
+
+    private Map<Long, DocApiClient> clientMap;
+
+    @Resource
+    private OcrSupplierService ocrSupplierService;
+
+    @PostConstruct
+    public synchronized void init() {
+        defaultClient = null;
+        clientMap = new HashMap<>();
+
+        List<OcrSupplier> list = ocrSupplierService.list();
+        for (OcrSupplier supplier : list) {
+            initApiClient(supplier);
+        }
+    }
+
+    private void initApiClient(OcrSupplier supplier) {
+        try {
+            String className = DocApiClient.class.getName().replace(DocApiClient.class.getSimpleName(), supplier.getClientClass());
+            DocApiConfig config = new DocApiConfig(supplier);
+            Class<?> clientClass = Class.forName(className);
+
+            Object clientInstance = clientClass.getConstructor(DocApiConfig.class).newInstance(config);
+            if (clientInstance instanceof DocApiClient) {
+                DocApiClient client = (DocApiClient) clientInstance;
+                clientMap.put(supplier.getId(), client);
+                // 取第一个enable=true的为默认客户端
+                if (supplier.getEnable() && defaultClient == null) {
+                    defaultClient = client;
+                }
+            }
+        } catch (Exception e) {
+            log.warn("DocApiClient init error, supplier:{} class:{}", supplier.getName(), supplier.getClientClass());
+        }
+    }
+
+    public ParseDocTask parseDocTask(byte[] fileData, String fileName) throws Exception {
+        if (defaultClient == null) {
+            throw new DocClientNotFound();
+        }
+        return defaultClient.parseDocTask(fileData, fileName);
+    }
+
+    public ParseDocTaskResult parseDocTaskQuery(String taskId) throws Exception {
+        if (defaultClient == null) {
+            throw new DocClientNotFound();
+        }
+        return defaultClient.parseDocTaskQuery(taskId);
+    }
+
+}

+ 3 - 32
src/main/java/com/qmth/ops/biz/service/OcrClientService.java

@@ -2,9 +2,6 @@ package com.qmth.ops.biz.service;
 
 import com.qmth.boot.core.ai.model.ocr.ImageType;
 import com.qmth.boot.core.ai.model.ocr.OcrType;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTask;
-import com.qmth.boot.core.ai.model.ocr.ParseDocTaskResult;
-import com.qmth.ops.biz.ai.client.DocApiClient;
 import com.qmth.ops.biz.ai.client.OcrApiClient;
 import com.qmth.ops.biz.ai.client.OcrApiConfig;
 import com.qmth.ops.biz.ai.exception.OcrClientNotFound;
@@ -35,6 +32,7 @@ public class OcrClientService {
     public synchronized void init() {
         defaultClient = null;
         clientMap = new HashMap<>();
+
         List<OcrSupplier> list = ocrSupplierService.list();
         for (OcrSupplier supplier : list) {
             initApiClient(supplier);
@@ -43,7 +41,7 @@ public class OcrClientService {
 
     private void initApiClient(OcrSupplier supplier) {
         try {
-            String className = OcrApiClient.class.getName().replace("OcrApiClient", supplier.getClientClass());
+            String className = OcrApiClient.class.getName().replace(OcrApiClient.class.getSimpleName(), supplier.getClientClass());
             OcrApiConfig config = new OcrApiConfig(supplier);
             Class<?> clientClass = Class.forName(className);
 
@@ -55,11 +53,9 @@ public class OcrClientService {
                 if (supplier.getEnable() && defaultClient == null) {
                     defaultClient = client;
                 }
-            } else {
-                log.warn("DocApiClient supplier:{} class:{}", supplier.getName(), supplier.getClientClass());
             }
         } catch (Exception e) {
-            log.error("OcrApiClient init error, supplier:{} class:{}", supplier.getName(), supplier.getClientClass());
+            log.warn("OcrApiClient init error, supplier:{} class:{}", supplier.getName(), supplier.getClientClass());
         }
     }
 
@@ -78,29 +74,4 @@ public class OcrClientService {
         return defaultClient.forImage(type, imageData, imageType);
     }
 
-    public ParseDocTask parseDocTask(byte[] fileData, String fileName) throws Exception {
-        DocApiClient client = this.getDefaultDocApiClient();
-        return client.parseDocTask(fileData, fileName);
-    }
-
-    public ParseDocTaskResult parseDocTaskQuery(String taskId) throws Exception {
-        DocApiClient client = this.getDefaultDocApiClient();
-        return client.parseDocTaskQuery(taskId);
-    }
-
-    private DocApiClient getDefaultDocApiClient() {
-        OcrSupplier supplier = ocrSupplierService.getById(3L);//todo
-
-        try {
-            String className = DocApiClient.class.getName().replace(DocApiClient.class.getSimpleName(), supplier.getClientClass());
-            OcrApiConfig config = new OcrApiConfig(supplier);
-            Class<?> clientClass = Class.forName(className);
-
-            return (DocApiClient) clientClass.getConstructor(OcrApiConfig.class).newInstance(config);
-        } catch (Exception e) {
-            log.error("DocApiClient init error, supplier:{} class:{}", supplier.getName(), supplier.getClientClass());
-            throw new OcrClientNotFound();
-        }
-    }
-
 }