From 61cfdecaf6b76acb27478e5901eb0908244e3875 Mon Sep 17 00:00:00 2001
From: sinake <sinake1@qq.com>
Date: 星期四, 15 十月 2026 16:36:54 +0800
Subject: [PATCH] 发票识别

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java |  162 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 147 insertions(+), 15 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
index d361a51..e6364fc 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -1,24 +1,31 @@
 package com.ruoyi.web.controller.common;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.ChineseUtils;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.FileUploadUtils;
 import com.ruoyi.common.utils.file.FileUtils;
 import com.ruoyi.framework.config.ServerConfig;
+import com.ruoyi.web.controller.tool.HttpUtils;
+import io.swagger.annotations.ApiOperation;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.coyote.AbstractProtocol;
+import org.apache.http.HttpResponse;
+import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
 import org.springframework.mock.web.MockMultipartFile;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.management.*;
@@ -26,7 +33,11 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.lang.management.ManagementFactory;
-import java.util.Set;
+import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
 
 /**
  * 閫氱敤璇锋眰澶勭悊
@@ -40,6 +51,8 @@
     @Autowired
     private ServerConfig serverConfig;
 
+    @Value("${appcode}")
+    private String  appcode;
 
     /**
      * 閫氱敤涓嬭浇璇锋眰
@@ -82,19 +95,23 @@
             String filename = file.getOriginalFilename().trim();
             String felinamePath = FileUploadUtils.extractFilename(file);
 //            String pathFileName = FileUploadUtils.getPathFileName(filePath, s);
-            File file1 = new File(filePath + "/" + felinamePath);
-            boolean exists = file1.exists();
-            if (exists) {
-                int i = filename.lastIndexOf(".");
-                String startStr = filename.substring(0, i);
-                String endStr = filename.substring(i, filename.length());
+            for (int i=1;i<500;i++) {
+                File file1 = new File(filePath + "/" + felinamePath);
+                boolean exists = file1.exists();
+                if (exists) {
+                    int index = filename.lastIndexOf(".");
+                    String startStr = filename.substring(0, index);
+                    String endStr = filename.substring(index, filename.length());
 
-                String newFilename = startStr + System.currentTimeMillis() + endStr; // your new filename
-                String contentType = file.getContentType();
-                byte[] bytes = file.getBytes();
-                file = new MockMultipartFile(newFilename, newFilename, contentType, bytes);
+                    String newFilename = startStr + "-" + i + endStr; // your new filename
+                    felinamePath = DateUtils.datePath() + "/" + newFilename;
+                    String contentType = file.getContentType();
+                    byte[] bytes = file.getBytes();
+                    file = new MockMultipartFile(newFilename, newFilename, contentType, bytes);
+                }else{
+                    break;
+                }
             }
-
             // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О
             String fileName = FileUploadUtils.upload(filePath, file);
             String url1 = serverConfig.getUrl();
@@ -114,6 +131,120 @@
         }
     }
 
+    public String aliOCR(String base64) {
+        String host = "https://mixedmulti.market.alicloudapi.com";
+        String path = "/ocrservice/mixedMultiInvoice";
+        String method = "POST";
+        Map<String, String> headers = new HashMap<String, String>();
+        //鏈�鍚庡湪header涓殑鏍煎紡(涓棿鏄嫳鏂囩┖鏍�)涓篈uthorization:APPCODE 83359fd73fe94948385f570e3c139105
+        headers.put("Authorization", "APPCODE " + appcode);
+        //鏍规嵁API鐨勮姹傦紝瀹氫箟鐩稿搴旂殑Content-Type
+        headers.put("Content-Type", "application/json; charset=UTF-8");
+        Map<String, String> querys = new HashMap<String, String>();
+        String bodys = "{\"img\":\""+base64+"\"}";
+
+
+        try {
+
+            HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
+            System.out.println(response.toString());
+            //鑾峰彇response鐨刡ody
+            String content=EntityUtils.toString(response.getEntity());
+            JSONObject jsonContent=JSONObject.parseObject(content);
+            JSONArray subMsgs=jsonContent.getJSONArray("subMsgs");
+            List<Map<String,Object>> lists=new ArrayList<>();
+            for(Object row: subMsgs){
+                Map<String,Object> tempList=new HashMap<>();
+                JSONObject rowObject=(JSONObject)row;
+                tempList.put("鍙戠エ鍒嗙被",rowObject.getString("type"));
+                JSONObject result=((JSONObject)rowObject.get("result")).getJSONObject("data");
+                for(Map.Entry<String, Object> entry : result.entrySet()){
+                    tempList.put(entry.getKey(),entry.getValue());
+                }
+                if(rowObject.getString("type").equals("閾惰鎵垮厬姹囩エ")){
+                    BigDecimal totalAmount= ChineseUtils.chineseToNumber(result.getString("绁ㄦ嵁閲戦澶у啓"));
+                    tempList.put("鍙戠エ閲戦",totalAmount);
+                }
+                if(rowObject.getString("type").equals("鐏溅绁�")){
+                    tempList.put("鍙戠エ閲戦",result.getString("绁ㄤ环"));
+                }
+
+                lists.add(tempList);
+            }
+            System.out.println(content);
+            return JSON.toJSONString(lists);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "{}";
+        }
+    }
+
+    /**
+     * 閫氱敤涓婁紶璇锋眰
+     */
+    @ApiOperation("testOCR")
+    @PostMapping("/common/testOCR")
+    public AjaxResult testOCR(@RequestBody String fileName) throws Exception {
+        Path filePath= Paths.get(fileName);
+        String base64= Base64.getEncoder().encodeToString( Files.readAllBytes(filePath));
+
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("OCRList", aliOCR(base64));
+        return ajax;
+    }
+
+    /**
+     * 閫氱敤涓婁紶璇锋眰
+     */
+    @PostMapping("/common/uploadOCR")
+    public AjaxResult uploadOCR(MultipartFile file) throws Exception {
+
+        try {
+            // 涓婁紶鏂囦欢璺緞
+            String filePath = RuoYiConfig.getUploadPath();
+
+            //鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+            String filename = file.getOriginalFilename().trim();
+            String felinamePath = FileUploadUtils.extractFilename(file);
+//            String pathFileName = FileUploadUtils.getPathFileName(filePath, s);
+            for (int i=1;i<500;i++) {
+                File file1 = new File(filePath + "/" + felinamePath);
+                boolean exists = file1.exists();
+                if (exists) {
+                    int index = filename.lastIndexOf(".");
+                    String startStr = filename.substring(0, index);
+                    String endStr = filename.substring(index, filename.length());
+
+                    String newFilename = startStr + "-" + i + endStr; // your new filename
+                    felinamePath = DateUtils.datePath() + "/" + newFilename;
+                    String contentType = file.getContentType();
+                    byte[] bytes = file.getBytes();
+                    file = new MockMultipartFile(newFilename, newFilename, contentType, bytes);
+                }else{
+                    break;
+                }
+            }
+            // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О
+            String fileName = FileUploadUtils.upload(filePath, file);
+            String url1 = serverConfig.getUrl();
+            log.info("url1鐨勫�紀ld :{}", url1);
+            if (url1.contains("8032")) {
+                //杩欓噷鐨�8032涓嶆槸tomcat鐨勶紝鎵�浠ヨ杞垚tomcat鐨�
+                url1 = url1.replace("8032", "8032/prod-api");
+            }
+            String base64= Base64.getEncoder().encodeToString(file.getBytes());
+
+            log.info("url1鐨勫�糿ew :{}", url1);
+            String url = url1 + fileName;
+            AjaxResult ajax = AjaxResult.success();
+            ajax.put("fileName", fileName);
+            ajax.put("url", url);
+            ajax.put("OCRList", aliOCR(base64));
+            return ajax;
+        } catch (Exception e) {
+            return AjaxResult.error(e.getMessage());
+        }
+    }
 
 //    private static void parseUTF(int[] bits) {
 //        int index = 0;//杩欎釜鎸囬拡鎸囧悜姣忎竴琛屽惊鐜椂鍒椾笅鏍囩殑浣嶇疆锛屼笅涓�琛屽紑濮嬫椂閲嶆柊缃綅0
@@ -177,4 +308,5 @@
         }
         return 0;
     }
+
 }
\ No newline at end of file

--
Gitblit v1.9.3