1
luodangjia
2025-01-21 68ee18438e99995d2d108cccb36e75f77ea96d76
1
4个文件已修改
1个文件已添加
330 ■■■■ 已修改文件
doc/aa.json 210 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/BusinessLicense.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/orc/OcrUtils.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/front/UserController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CommonController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/BusinessLicense.java
New file
@@ -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;
}
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);
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("验证码已失效");
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();
    }
}