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