Просмотр исходного кода

证件识别,1.重复证件从redis取;2.外部接口url配置化

y 2 лет назад
Родитель
Сommit
9a625bc7b6

+ 6 - 0
src/main/java/com/ydtech/modules/order/constants/OrderCacheConstant.java

@@ -67,6 +67,12 @@ public class OrderCacheConstant {
      */
     public static final String GR_SPECIAL_AGREEMENT_KEY = "gr:specialAgreement:";
 
+
+    /**
+     * 图片识别 key
+     */
+    public static final String IMAGE_IDENTIFY_KEY = "image:identify:";
+
     /**
      * 国任特别约定 存储时间
      */

+ 1 - 1
src/main/java/com/ydtech/modules/order/controller/IdentifyController.java

@@ -32,7 +32,7 @@ public class IdentifyController {
     }
 
     @PostMapping("/drivingPermit")
-    @ApiOperation(value = "行驶证正反面识别")
+    @ApiOperation(value = "行驶证正反面识别")  
     public HttpResult<Map<String, Object>> drivingPermit(MultipartFile image1, MultipartFile image2) {
         return identifyService.drivingPermit(image1, image2);
     }

+ 57 - 5
src/main/java/com/ydtech/modules/order/service/impl/IdentifyServiceImpl.java

@@ -8,17 +8,26 @@ import com.ydtech.modules.order.entity.BusinessLicense;
 import com.ydtech.modules.order.service.IdentifyService;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
 import com.ydtech.utils.ImageCompressionUtils;
+import com.ydtech.utils.ObjectUtil;
+import com.ydtech.utils.StringUtils;
 import com.ydtech.utils.baidu.BusinessLicenseRecognition;
 import com.ydtech.utils.baidu.Idcard;
 import com.ydtech.utils.baidu.MultiObjectDetect;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import java.io.IOException;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import static com.ydtech.modules.order.constants.OrderCacheConstant.IMAGE_IDENTIFY_KEY;
 
 /**
  * @author wenks
@@ -29,16 +38,39 @@ import java.util.Map;
 @Service
 public class IdentifyServiceImpl implements IdentifyService {
 
+
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
     @Override
     public HttpResult<Map<String, Object>> idCard(MultipartFile image1, MultipartFile image2) {
         Map<String, Object> map = new HashMap<>();
         CustomerInfoVO customerInfoVO = new CustomerInfoVO();
 
         String s1 = byteToBase64(image1);
-        Idcard.getIdCardFront(s1, customerInfoVO);
+
+        if (StringUtils.isNotBlank(s1) && !ObjectUtil.isAllFieldNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s1))) {
+            //走缓存
+            BeanUtils.copyProperties(Objects.requireNonNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s1)), customerInfoVO);
+        } else {
+            //识别身份证正面
+            Idcard.getIdCardFront(s1, customerInfoVO);
+            AssertionUtils.isEmpty(customerInfoVO, "身份证识别失败");
+            //设置缓存
+            redisTemplate.opsForValue().set(IMAGE_IDENTIFY_KEY + s1, customerInfoVO, 1, TimeUnit.DAYS);
+        }
 
         String s2 = byteToBase64(image2);
-        Idcard.getIdCardBack(s2, customerInfoVO);
+        if (StringUtils.isNotBlank(s2) && !ObjectUtil.isAllFieldNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s2))) {
+            //走缓存
+            BeanUtils.copyProperties(Objects.requireNonNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s2)),customerInfoVO);
+        }else {
+            //识别身份证背面
+            Idcard.getIdCardBack(s2, customerInfoVO);
+            AssertionUtils.isEmpty(customerInfoVO, "身份证识别失败");
+            //设置缓存
+            redisTemplate.opsForValue().set(IMAGE_IDENTIFY_KEY + s2, customerInfoVO, 1, TimeUnit.DAYS);
+        }
 
         AssertionUtils.isEmpty(customerInfoVO, "身份证识别失败");
         map.put("customerInfo", customerInfoVO);
@@ -51,12 +83,30 @@ public class IdentifyServiceImpl implements IdentifyService {
         CardUserInfo cardUserInfo = new CardUserInfo();
 
         String s1 = byteToBase64(image1);
-        MultiObjectDetect.drivingPermitFront(s1, cardUserInfo);
+        if (StringUtils.isNotBlank(s1) && !ObjectUtil.isAllFieldNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s1))) {
+            //走缓存
+            BeanUtils.copyProperties(Objects.requireNonNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s1)),cardUserInfo);
+        } else {
+            //行驶证正面识别
+            MultiObjectDetect.drivingPermitFront(s1, cardUserInfo);
+            AssertionUtils.isEmpty(cardUserInfo, "行驶证正面识别失败");
+            //设置缓存
+            redisTemplate.opsForValue().set(IMAGE_IDENTIFY_KEY + s1, cardUserInfo, 1, TimeUnit.DAYS);
+        }
 
         String s2 = byteToBase64(image2);
-        MultiObjectDetect.drivingPermitBack(s2, cardUserInfo);
+        if (StringUtils.isNotBlank(s2) && !ObjectUtil.isAllFieldNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s2))) {
+            //走缓存
+            BeanUtils.copyProperties(Objects.requireNonNull(redisTemplate.opsForValue().get(IMAGE_IDENTIFY_KEY + s2)),cardUserInfo);
+        }else {
+            //行驶证反面识别
+            MultiObjectDetect.drivingPermitBack(s2, cardUserInfo);
+            AssertionUtils.isEmpty(cardUserInfo, "行驶证正面识别失败");
+            //设置缓存
+            redisTemplate.opsForValue().set(IMAGE_IDENTIFY_KEY + s2, cardUserInfo, 1, TimeUnit.DAYS);
+        }
 
-        AssertionUtils.isEmpty(cardUserInfo, "身份证识别失败");
+        AssertionUtils.isEmpty(cardUserInfo, "行驶证正面识别失败");
         map.put("carInfo", cardUserInfo);
         return HttpResult.ok("success", map);
     }
@@ -85,4 +135,6 @@ public class IdentifyServiceImpl implements IdentifyService {
     }
 
 
+
+
 }

+ 41 - 0
src/main/java/com/ydtech/utils/ObjectUtil.java

@@ -0,0 +1,41 @@
+package com.ydtech.utils;
+import java.lang.reflect.Field;
+/**
+ * @author jianlong
+ * @date 2024-03-19 09:26
+ */
+import java.util.*;
+
+
+public class ObjectUtil {
+    /**
+     * 判断该对象是否所有属性为空
+     * 返回ture表示所有属性为null,返回false表示不是所有属性都是null
+     */
+    public static boolean isAllFieldNull(Object object) {
+        boolean flag = true;
+
+        if(object == null) return flag;
+        Class clazz = object.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        for (Field field : fields) {
+            //设置属性是可以访问的(私有的也可以)
+            field.setAccessible(true);
+            Object value = null;
+            try {
+                value = field.get(object);
+                // 只要有1个属性不为空,那么就不是所有的属性值都为空
+                if (value != null) {
+                    flag = false;
+                    break;
+                }
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return flag;
+    }
+}
+

+ 18 - 6
src/main/java/com/ydtech/utils/baidu/AuthService.java

@@ -11,7 +11,11 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
@@ -28,11 +32,19 @@ import java.util.Map;
  * @Date 2021/6/25
  **/
 @Slf4j
+@Component
 public class AuthService {
 
 
-    private AuthService() {
-        throw new IllegalStateException("Utility class");
+    @Autowired
+    private Environment environment;
+
+    @Autowired
+    private static Environment staticEnvironment;
+
+    @PostConstruct
+    public void init() {
+        staticEnvironment = environment;
     }
 
     /**
@@ -49,9 +61,9 @@ public class AuthService {
 //        String clientId = "MN5kwB9Qvi77eTKexMG69HH1";
 //        // 官网获取的 Secret Key 更新为你注册的
 //        String clientSecret = "LIZb0viMF5833zNHhhok3Kl1wqF9qWue";
+        String clientId = staticEnvironment.getProperty("clientId");
+        String clientSecret = staticEnvironment.getProperty("clientSecret");
 
-        String clientId = "xG9M8tSjNvYPwSTNavM0ELlD";
-        String clientSecret = "riYIRG67akE5FGVwnHE3dGBly5zmdS6t";
         return getAuth(clientId, clientSecret);
     }
 
@@ -66,7 +78,7 @@ public class AuthService {
      */
     public static String getAuth(String ak, String sk) {
         // 获取token地址
-        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
+        String authHost = staticEnvironment.getProperty("authHost");
         String getAccessTokenUrl = authHost
                 // 1. grant_type为固定参数
                 + "grant_type=client_credentials"
@@ -144,4 +156,4 @@ public class AuthService {
         }
     }
 
-}
+}

+ 19 - 5
src/main/java/com/ydtech/utils/baidu/Idcard.java

@@ -7,7 +7,11 @@ import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.ins.model.CustomerInfoVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Map;
@@ -16,12 +20,22 @@ import java.util.Map;
  * 身份证识别
  */
 @Slf4j
+@Component
 public class Idcard {
 
-    private Idcard() {
-        throw new IllegalStateException("Idcard class");
+
+    @Autowired
+    private Environment environment;
+
+    @Autowired
+    private static Environment staticEnvironment;
+
+    @PostConstruct
+    public void init() {
+        staticEnvironment = environment;
     }
 
+
     /**
      * 重要提示代码中所需工具类
      * FileUtil,Base64Util,HttpUtil,GsonUtils请从
@@ -37,7 +51,7 @@ public class Idcard {
         String accessToken = AuthService.getAuth();
         Map<String, Object> ma = new HashMap<>();
         // 请求url
-        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
+        String url = staticEnvironment.getProperty("idcard");
         try {
             String imgParam = URLEncoder.encode(imgs, "UTF-8");
             String param = "id_card_side=" + "front" + "&image=" + imgParam + "&detect_photo=true";
@@ -68,7 +82,7 @@ public class Idcard {
         //// 从redis中获取信息,redis保存时间是20天。
         String accessToken = AuthService.getAuth();
         // 请求url
-        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
+        String url = staticEnvironment.getProperty("idcard");
         try {
             String imgParam = URLEncoder.encode(image, "UTF-8");
             String param = "id_card_side=" + idCardSide + "&image=" + imgParam + "&detect_photo=true";
@@ -122,4 +136,4 @@ public class Idcard {
     }
 
 
-}
+}

+ 20 - 2
src/main/java/com/ydtech/utils/baidu/MultiObjectDetect.java

@@ -6,7 +6,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.ins.model.CardUserInfo;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Map;
@@ -17,14 +21,28 @@ import java.util.Map;
  * @Author
  * @Date 2021/6/25
  **/
+@Component
 public class MultiObjectDetect {
 
 
+    @Autowired
+    private Environment environment;
+
+    @Autowired
+    private static Environment staticEnvironment;
+
+    @PostConstruct
+    public void init() {
+        staticEnvironment = environment;
+    }
+
+
+
     public static HttpResult multiObjectDetect(String imgData) {
         Map<String, Object> ma = new HashMap<>();
 
         // 请求url
-        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license";
+        String url = staticEnvironment.getProperty("vehicle");
         try {
             // 本地文件路径
             imgData = imgData.substring(imgData.indexOf(",") + 1);
@@ -75,7 +93,7 @@ public class MultiObjectDetect {
 
     public static JSONObject request(String images, String vehicleLicenseSide) {
         // 请求url
-        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license";
+        String url = staticEnvironment.getProperty("vehicle");
         try {
 
             images = images.substring(images.indexOf(",") + 1);

+ 8 - 0
src/main/resources/application-pre.yml

@@ -11,6 +11,14 @@ ZMIMGUrl: https://www.echinacoal.com/singlePlatform/others/
 ZMSMSUrl: https://www.echinacoal.com/singlePlatform/prpall/
 ZMToken: THIRDSCOuloft2020052818346904zmYBSXQYTQ
 ZMUrl: https://www.echinacoal.com/singlePlatform/
+
+#百度图片识别API
+clientId: xG9M8tSjNvYPwSTNavM0ELlD
+clientSecret: riYIRG67akE5FGVwnHE3dGBly5zmdS6t
+authHost: https://aip.baidubce.com/oauth/2.0/token?
+vehicle: https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license
+idcard: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
+
 aly:
   cbit:
     url_pre: http://223.70.186.115:80/CBIT/API/insCBIT

+ 8 - 0
src/main/resources/application-prod.yml

@@ -11,6 +11,14 @@ ZMIMGUrl: https://www.echinacoal.com/singlePlatform/others/
 ZMSMSUrl: https://www.echinacoal.com/singlePlatform/prpall/
 ZMToken: THIRDSCOuloft2020052818346904zmYBSXQYTQ
 ZMUrl: https://www.echinacoal.com/singlePlatform/
+
+#百度图片识别API
+clientId: xG9M8tSjNvYPwSTNavM0ELlD
+clientSecret: riYIRG67akE5FGVwnHE3dGBly5zmdS6t
+authHost: https://aip.baidubce.com/oauth/2.0/token?
+vehicle: https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license
+idcard: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
+
 aly:
   cbit:
     url_pre: http://223.70.186.115:80/CBIT/API/insCBIT

+ 8 - 0
src/main/resources/application-test.yml

@@ -13,6 +13,14 @@ ZMSMSUrl: https://test.echinacoal.com/singlePlatform/prpall/
 ZMToken: THIRDSCOuloft2020052818346904zmYBSX
 #中煤接口测试地址
 ZMUrl: https://test.echinacoal.com/singlePlatform/
+
+#百度图片识别API
+clientId: xG9M8tSjNvYPwSTNavM0ELlD
+clientSecret: riYIRG67akE5FGVwnHE3dGBly5zmdS6t
+authHost: https://aip.baidubce.com/oauth/2.0/token?
+vehicle: https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license
+idcard: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
+
 aly:
   cbit:
     #================ 阿里云部署对接保信服务器==============#