From 68ee18438e99995d2d108cccb36e75f77ea96d76 Mon Sep 17 00:00:00 2001
From: luodangjia <luodangjia>
Date: 星期二, 21 一月 2025 17:36:08 +0800
Subject: [PATCH] 1

---
 ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/front/UserController.java |    2 
 doc/aa.json                                                                                      |  210 +++++++++++++++++++++++++++-------
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/orc/OcrUtils.java       |   22 ---
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CommonController.java       |   59 +++++++++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/BusinessLicense.java         |   37 ++++++
 5 files changed, 262 insertions(+), 68 deletions(-)

diff --git a/doc/aa.json b/doc/aa.json
index 2c69925..be35ff6 100644
--- a/doc/aa.json
+++ b/doc/aa.json
@@ -1,42 +1,68 @@
 {
   "headers": {
     "access-control-allow-origin": "*",
-    "date": "Tue, 21 Jan 2025 07:22:51 GMT",
+    "date": "Tue, 21 Jan 2025 09:11:42 GMT",
     "keep-alive": "timeout=25",
     "transfer-encoding": "chunked",
     "vary": "Accept-Encoding",
-    "x-acs-request-id": "4545720F-58C2-579E-A1CE-08FDDFDF3296",
+    "x-acs-request-id": "05842EC7-FAA4-5BF7-9C8E-BD7E705262BF",
     "connection": "keep-alive",
     "content-type": "application/json;charset=utf-8",
     "access-control-expose-headers": "*",
-    "x-acs-trace-id": "2a95d25064c13621b98f3883185aadc1"
+    "x-acs-trace-id": "200f635b624967d00167ded6423480c0"
   },
   "body": {
-    "RequestId": "4545720F-58C2-579E-A1CE-08FDDFDF3296",
+    "RequestId": "05842EC7-FAA4-5BF7-9C8E-BD7E705262BF",
     "Data": {
       "SubImages": [
         {
           "FigureInfo": {
-            "face": {
+            "blicense_title": {
               "FigureCount": 1,
               "FigureDetails": [
                 {
                   "FigurePoints": [
                     {
-                      "X": 672,
-                      "Y": 289
+                      "X": 648,
+                      "Y": 311
                     },
                     {
-                      "X": 949,
-                      "Y": 288
+                      "X": 1111,
+                      "Y": 312
                     },
                     {
-                      "X": 950,
-                      "Y": 624
+                      "X": 1112,
+                      "Y": 415
                     },
                     {
-                      "X": 672,
-                      "Y": 624
+                      "X": 648,
+                      "Y": 414
+                    }
+                  ],
+                  "FigureAngle": 0
+                }
+              ]
+            },
+            "national_emblem": {
+              "FigureCount": 1,
+              "FigureDetails": [
+                {
+                  "FigurePoints": [
+                    {
+                      "X": 787,
+                      "Y": 141
+                    },
+                    {
+                      "X": 965,
+                      "Y": 141
+                    },
+                    {
+                      "X": 964,
+                      "Y": 265
+                    },
+                    {
+                      "X": 786,
+                      "Y": 264
                     }
                   ],
                   "FigureAngle": 0
@@ -46,55 +72,116 @@
           },
           "SubImageId": 0,
           "KvInfo": {
-            "KvCount": 6,
+            "KvCount": 14,
             "Data": {
-              "address": "黑龙江省宁安市渤海镇玄武大街35号",
-              "ethnicity": "汉",
-              "sex": "女",
-              "name": "陆佳欣",
-              "idNumber": "231084200002060822",
-              "birthDate": "2000年2月6日"
+              "RegistrationDate": "2022年08月11日",
+              "companyType": "其他有限责任公司",
+              "companyName": "新疆新省事大数据有限公司",
+              "businessScope": "许可项目:第一类增值电信业务:建筑智能化系统设计;农作物种子进出口;建设工程设计;建设工程施工;住宅室内装饰装修。(依法须经批准的项目,经相关部门批准后方可升展经营活动,具体经营项目以相关部门批准文件或许可证件为准)一般项目:数据处理和存储支持服务:人工智能理论与算法软件开发:智能机器人的研发;云计算装备技术服务;云计算设备销售;数字内容制作服务(不含出版发行);通信设备销售;安防设备销售:信息安全设备销售:信息安全设备制造:卫星导航服务;导航终端销售;导航终端制造;导航、测绘、气象及海洋专用仪器销售;环境保护专用设备销售;光通信设备销售;技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广:软件开发:信息系统集成服务:卫星技术综合应用系统集成:货物进出口;农副产品销售:食品进出口:酒店管理:物业管理:广告发布;广告设计、代理;广告制作;第一类医疗器械销售;第二类医疗器栈销售;教育咨询服务(不含涉许可审批的教育培训活动);大数据服务;互联网数据服务;物联网应用服务;安全技术防范系统设计施工服务;信息系统运行维护服务:数据处理服务:信息技术咨询服务;5G通信技术服务;工业工程设计服务;移动通信设备制造;移动通信设备销售;通信传输设备专业修理;通信交换设备专业修理;网络设备制造:网络设备销售;普通机械设备安装服务;计算机软硬件及辅助设备零售;计算机软硬件及辅助设备批发;计算机软硬件及外围设备制造:平面设计;技术进出口:劳务服务(不含劳务派遣)。(除依法须经批准的项目外,凭营业执照依法自主开展经营活动)",
+              "title": "营业执照",
+              "validPeriod": "",
+              "companyForm": "",
+              "creditCode": "91650106MABWEMX61X",
+              "registeredCapital": "壹仟万元整",
+              "legalPerson": "张丹",
+              "validFromDate": "20220811",
+              "businessAddress": "新疆乌鲁木齐经济技术开发区(头屯河区)玄武湖路433号经开万达广场12号写字楼办公1217室",
+              "issueDate": "2023年07月21日",
+              "validToDate": ""
             },
             "KvDetails": {
-              "address": {
-                "KeyName": "address",
+              "RegistrationDate": {
+                "KeyName": "RegistrationDate",
+                "ValueAngle": 0,
+                "Value": "2022年08月11日",
+                "KeyConfidence": 96,
+                "ValueConfidence": 96
+              },
+              "companyType": {
+                "KeyName": "companyType",
+                "ValueAngle": 0,
+                "Value": "其他有限责任公司",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "companyName": {
+                "KeyName": "companyName",
+                "ValueAngle": 0,
+                "Value": "新疆新省事大数据有限公司",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "businessScope": {
+                "KeyName": "businessScope",
+                "ValueAngle": 0,
+                "Value": "许可项目:第一类增值电信业务:建筑智能化系统设计;农作物种子进出口;建设工程设计;建设工程施工;住宅室内装饰装修。(依法须经批准的项目,经相关部门批准后方可升展经营活动,具体经营项目以相关部门批准文件或许可证件为准)一般项目:数据处理和存储支持服务:人工智能理论与算法软件开发:智能机器人的研发;云计算装备技术服务;云计算设备销售;数字内容制作服务(不含出版发行);通信设备销售;安防设备销售:信息安全设备销售:信息安全设备制造:卫星导航服务;导航终端销售;导航终端制造;导航、测绘、气象及海洋专用仪器销售;环境保护专用设备销售;光通信设备销售;技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广:软件开发:信息系统集成服务:卫星技术综合应用系统集成:货物进出口;农副产品销售:食品进出口:酒店管理:物业管理:广告发布;广告设计、代理;广告制作;第一类医疗器械销售;第二类医疗器栈销售;教育咨询服务(不含涉许可审批的教育培训活动);大数据服务;互联网数据服务;物联网应用服务;安全技术防范系统设计施工服务;信息系统运行维护服务:数据处理服务:信息技术咨询服务;5G通信技术服务;工业工程设计服务;移动通信设备制造;移动通信设备销售;通信传输设备专业修理;通信交换设备专业修理;网络设备制造:网络设备销售;普通机械设备安装服务;计算机软硬件及辅助设备零售;计算机软硬件及辅助设备批发;计算机软硬件及外围设备制造:平面设计;技术进出口:劳务服务(不含劳务派遣)。(除依法须经批准的项目外,凭营业执照依法自主开展经营活动)",
+                "KeyConfidence": 99,
+                "ValueConfidence": 98
+              },
+              "title": {
+                "KeyName": "title",
+                "ValueAngle": 0,
+                "Value": "营业执照",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "companyForm": {
+                "KeyName": "companyForm",
+                "Value": "",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "validPeriod": {
+                "KeyName": "validPeriod",
+                "Value": "",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "creditCode": {
+                "KeyName": "creditCode",
                 "ValueAngle": 1,
-                "Value": "黑龙江省宁安市渤海镇玄武大街35号",
+                "Value": "91650106MABWEMX61X",
                 "KeyConfidence": 100,
                 "ValueConfidence": 100
               },
-              "ethnicity": {
-                "KeyName": "ethnicity",
+              "registeredCapital": {
+                "KeyName": "registeredCapital",
                 "ValueAngle": 0,
-                "Value": "汉",
+                "Value": "壹仟万元整",
                 "KeyConfidence": 100,
                 "ValueConfidence": 100
               },
-              "sex": {
-                "KeyName": "sex",
+              "legalPerson": {
+                "KeyName": "legalPerson",
                 "ValueAngle": 0,
-                "Value": "女",
+                "Value": "张丹",
                 "KeyConfidence": 100,
                 "ValueConfidence": 100
               },
-              "name": {
-                "KeyName": "name",
+              "validFromDate": {
+                "KeyName": "validFromDate",
                 "ValueAngle": 0,
-                "Value": "陆佳欣",
+                "Value": "20220811",
                 "KeyConfidence": 100,
-                "ValueConfidence": 100
+                "ValueConfidence": 96
               },
-              "idNumber": {
-                "KeyName": "idNumber",
-                "ValueAngle": 1,
-                "Value": "231084200002060822",
-                "KeyConfidence": 100,
-                "ValueConfidence": 100
-              },
-              "birthDate": {
-                "KeyName": "birthDate",
+              "issueDate": {
+                "KeyName": "issueDate",
                 "ValueAngle": 0,
-                "Value": "2000年2月6日",
+                "Value": "2023年07月21日",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "businessAddress": {
+                "KeyName": "businessAddress",
+                "ValueAngle": 0,
+                "Value": "新疆乌鲁木齐经济技术开发区(头屯河区)玄武湖路433号经开万达广场12号写字楼办公1217室",
+                "KeyConfidence": 100,
+                "ValueConfidence": 100
+              },
+              "validToDate": {
+                "KeyName": "validToDate",
+                "Value": "",
                 "KeyConfidence": 100,
                 "ValueConfidence": 100
               }
@@ -103,13 +190,44 @@
           "QualityInfo": {
             "IsCopy": false
           },
-          "Type": "身份证正面",
+          "BarCodeInfo": {
+            "BarCodeDetails": [],
+            "BarCodeCount": 0
+          },
+          "Type": "营业执照",
+          "QrCodeInfo": {
+            "QrCodeDetails": [
+              {
+                "QrCodeAngle": 0,
+                "Data": "http://www.gsxt.gov.cn/index.html?uniscid=91650106MABWEMX61X",
+                "QrCodePoints": [
+                  {
+                    "X": 1324,
+                    "Y": 309
+                  },
+                  {
+                    "X": 1457,
+                    "Y": 309
+                  },
+                  {
+                    "X": 1457,
+                    "Y": 442
+                  },
+                  {
+                    "X": 1324,
+                    "Y": 442
+                  }
+                ]
+              }
+            ],
+            "QrCodeCount": 1
+          },
           "Angle": 0
         }
       ],
-      "Height": 852,
+      "Height": 1280,
       "SubImageCount": 1,
-      "Width": 1136
+      "Width": 1755
     }
   },
   "statusCode": 200
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/BusinessLicense.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/BusinessLicense.java
new file mode 100644
index 0000000..7b264ed
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/BusinessLicense.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "营业执照信息")
+public class BusinessLicense {
+    @Schema(description = "注册日期")
+    private String RegistrationDate;
+    @Schema(description = "公司类型")
+    private String companyType;
+    @Schema(description = "公司名称")
+    private String companyName;
+    @Schema(description = "经营范围")
+    private String businessScope;
+    @Schema(description = "抬头")
+    private String title;
+    @Schema(description = "有效期")
+    private String validPeriod;
+    @Schema(description = "公司形式")
+    private String companyForm;
+    @Schema(description = "统一社会信用代码")
+    private String creditCode;
+    @Schema(description = "注册资本")
+    private String registeredCapital;
+    @Schema(description = "法人")
+    private String legalPerson;
+    @Schema(description = "有效期从")
+    private String validFromDate;
+    @Schema(description = "地址")
+    private String businessAddress;
+    @Schema(description = "有效期至")
+    private String issueDate;
+    @Schema(description = "有效期至")
+    private String validToDate;
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/orc/OcrUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/orc/OcrUtils.java
index 6e0d145..68b0f44 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/orc/OcrUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/orc/OcrUtils.java
@@ -38,32 +38,18 @@
     /**
      * 证件识别
      */
-    public static JSONObject idCard(InputStream bodyStream) throws Exception {
+    public static String idCard(InputStream bodyStream,String type) throws Exception {
         com.aliyun.ocr_api20210707.Client client = createClient();
         // 需要安装额外的依赖库,直接点击下载完整工程即可看到所有依赖。
         RecognizeAllTextRequest recognizeAllTextRequest = new RecognizeAllTextRequest()
                 .setBody(bodyStream)
-                .setType("IdCard")
+                .setType(type)
                 .setOutputFigure(true);
         RuntimeOptions runtime = new RuntimeOptions();
         try {
             // 复制代码运行请自行打印 API 的返回值
             RecognizeAllTextResponse recognizeAllTextResponse = client.recognizeAllTextWithOptions(recognizeAllTextRequest, runtime);
-            String jsonString = Common.toJSONString(TeaModel.buildMap(recognizeAllTextResponse));
-            JSONObject jsonObject = JSONObject.parseObject(jsonString);
-            Integer statusCode = jsonObject.getInteger("statusCode");
-            if (statusCode != 200) {
-                throw new RuntimeException("识别失败");
-            }
-            JSONObject body = jsonObject.getJSONObject("body");
-            JSONObject data = body.getJSONObject("Data");
-            JSONArray subImages = body.getJSONArray("SubImages");
-            if (subImages != null && !subImages.isEmpty()){
-                JSONObject subImage = subImages.getJSONObject(0);
-                JSONObject kvInfo = subImage.getJSONObject("KvInfo");
-                return kvInfo.getJSONObject("Data");
-            }
-            return null;
+            return Common.toJSONString(TeaModel.buildMap(recognizeAllTextResponse));
         } catch (TeaException error) {
             // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
             // 错误 message
@@ -86,7 +72,7 @@
 
     public static void main(String[] args) {
         try {
-            InputStream inputStream = UrlDownloader.downloadAsStream("https://ai.bdstatic.com/file/3C8C5B451BB4445697730217EC8648E3");
+            InputStream inputStream = UrlDownloader.downloadAsStream("http://192.168.110.188:9300/statics/2025/01/21/862dab34c5f83ce2635d219c467ac9f6_20250121170536A004.jpg");
             idCard(inputStream);
         } catch (Exception e) {
             throw new RuntimeException(e);
diff --git a/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/front/UserController.java b/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/front/UserController.java
index e44e2e9..1cc644c 100644
--- a/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/front/UserController.java
+++ b/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/front/UserController.java
@@ -100,7 +100,7 @@
         if (!user.getPhone().equals(updatePhone.getOldPhone())) {
             return R.fail("旧手机号错误");
         }
-        String verifyKey = CacheConstants.PHONE_CODE_KEY + StringUtils.nvl(user.getPhone(), "");
+        String verifyKey = CacheConstants.PHONE_CODE_KEY + StringUtils.nvl(updatePhone.getNewPhone(), "");
         String captcha = redisService.getCacheObject(verifyKey);
         if (captcha == null) {
             throw new CaptchaException("验证码已失效");
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CommonController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CommonController.java
index 2efdc40..8866e3f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CommonController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CommonController.java
@@ -1,9 +1,12 @@
 package com.ruoyi.system.controller;
 
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.UrlDownloader;
 import com.ruoyi.common.core.utils.orc.OcrUtils;
+import com.ruoyi.system.api.model.BusinessLicense;
 import com.ruoyi.system.api.model.IdCard;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -28,11 +31,61 @@
         InputStream inputStream;
         try {
             inputStream = UrlDownloader.downloadAsStream(url);
-            JSONObject jsonObject = OcrUtils.idCard(inputStream);
-            IdCard idCard = JSONObject.parseObject(jsonObject.toJSONString(), IdCard.class);
-            return R.ok(idCard);
+            String jsonStr = OcrUtils.idCard(inputStream,"IdCard");
+            if (StringUtils.isEmpty(jsonStr)){
+                return R.fail();
+            }
+
+            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+            Integer statusCode = jsonObject.getInteger("statusCode");
+            if (statusCode != 200) {
+                return R.fail("识别失败");
+            }
+            JSONObject body = jsonObject.getJSONObject("body");
+            JSONObject data = body.getJSONObject("Data");
+            JSONArray subImages = data.getJSONArray("SubImages");
+            if (subImages != null && !subImages.isEmpty()){
+                JSONObject subImage = subImages.getJSONObject(0);
+                JSONObject kvInfo = subImage.getJSONObject("KvInfo");
+                IdCard idCard = kvInfo.getObject("Data", IdCard.class);
+                return R.ok(idCard);
+            }
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
+        return R.fail();
+    }
+
+    /**
+     * ocr提取营业执照信息
+     */
+    @GetMapping("/businessLicense")
+    @Operation(summary = "ocr提取营业执照信息", description = "ocr提取营业执照信息")
+    public R<BusinessLicense> businessLicense(@Parameter(name = "url", description = "图片地址") String url) {
+        InputStream inputStream;
+        try {
+            inputStream = UrlDownloader.downloadAsStream(url);
+            String jsonStr = OcrUtils.idCard(inputStream,"BusinessLicense");
+            if (StringUtils.isEmpty(jsonStr)){
+                return R.fail();
+            }
+            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+            Integer statusCode = jsonObject.getInteger("statusCode");
+            if (statusCode != 200) {
+                return R.fail("识别失败");
+            }
+            JSONObject body = jsonObject.getJSONObject("body");
+            JSONObject data = body.getJSONObject("Data");
+            JSONArray subImages = data.getJSONArray("SubImages");
+            if (subImages != null && !subImages.isEmpty()){
+                JSONObject subImage = subImages.getJSONObject(0);
+                JSONObject kvInfo = subImage.getJSONObject("KvInfo");
+                BusinessLicense businessLicense = kvInfo.getObject("Data", BusinessLicense.class);
+                return R.ok(businessLicense);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return R.fail();
     }
 }

--
Gitblit v1.7.1