he2802 3 rokov pred
rodič
commit
b633423e65

+ 21 - 7
zhongzheng-api/src/main/java/com/zhongzheng/controller/face/FaceController.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.face;
 
+import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.utils.ServletUtils;
@@ -11,9 +12,9 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
 
 /**
  * 人脸核身Controller
@@ -33,11 +34,24 @@ public class FaceController extends BaseController {
 
 
     @ApiOperation("人脸匹配")
-    @GetMapping("/certification/CompareFace")
-    public AjaxResult CompareFace(FaceQueryBo bo) throws Exception {
+    @PostMapping("/certification/CompareFace")
+    public AjaxResult<Integer> CompareFace(@RequestBody FaceQueryBo bo){
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iFaceService.CompareFace(bo));
+    }
+
+    @ApiOperation("身份证识别")
+    @PostMapping("/certification/IDCardOCR")
+    public AjaxResult IDCardOCR(@RequestBody FaceQueryBo bo){
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
-        iFaceService.CompareFace(bo);
-        return AjaxResult.success();
+        Map<String,String> rs = iFaceService.IDCardOCR(bo);
+        if(Validator.isNotEmpty(rs)){
+            return AjaxResult.success(rs);
+        }else{
+            return AjaxResult.error();
+        }
+
     }
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java

@@ -20,7 +20,7 @@ public interface OssService {
 
     String uploadInputStream(InputStream inputStream,Integer imageStatus) throws Exception;
 
-    String uploadBase64(String fileStr);
+    String uploadBase64(String fileStr,OssRequest ossRequest);
 
     void closeClient();
 }

+ 80 - 14
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java

@@ -65,7 +65,7 @@ public class OssServiceImpl implements OssService {
         JSONObject resultBean = new JSONObject();
         // 存储目录
 
-        String dir = ALIYUN_OSS_DIR_PREFIX+ this.generateRandomFilename(ossRequest);
+        String dir = ALIYUN_OSS_DIR_PREFIX+ this.generateRandomDirname(ossRequest);
         // 签名有效期
         long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;
         Date expiration = new Date(expireEndTime);
@@ -101,8 +101,8 @@ public class OssServiceImpl implements OssService {
         return new ResultBean(resultBean);
     }
 
-
-    public String generateRandomFilename(OssRequest ossRequest) {
+    //生成存储目录
+    public String generateRandomDirname(OssRequest ossRequest) {
         String prefixName = "";
         if(Validator.isNotEmpty(ossRequest.getUserId())&&ossRequest.getUserId().longValue()>0){
             prefixName = prefixName + ossRequest.getUserId();
@@ -152,6 +152,58 @@ public class OssServiceImpl implements OssService {
         return RandomFilename;
     }
 
+
+    //生成存储文件名
+    public String generateRandomFilename(OssRequest ossRequest) {
+        String prefixName = "";
+        if(Validator.isNotEmpty(ossRequest.getUserId())&&ossRequest.getUserId().longValue()>0){
+            prefixName = prefixName + ossRequest.getUserId();
+        }
+        if(Validator.isNotEmpty(ossRequest.getGradeId())&&ossRequest.getGradeId().longValue()>0){
+            prefixName = prefixName + "/" + ossRequest.getGradeId();
+        }
+        String RandomFilename = "";
+        //生成随机数
+        Random rand = new Random();
+        int random = rand.nextInt();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        Calendar calCurrent = Calendar.getInstance();
+        int intDay = calCurrent.get(Calendar.DATE);
+        int intMonth = calCurrent.get(Calendar.MONTH) + 1;
+        int intYear = calCurrent.get(Calendar.YEAR);
+        String now = String.valueOf(System.currentTimeMillis()) ;
+
+        RandomFilename = now + String.valueOf(random > 0 ? random : (-1) * random);
+        switch(ossRequest.getImageStatus()){
+            case 0 :
+                RandomFilename = "avatar"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 1 :
+                RandomFilename = "IDNumber"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 2 :
+                RandomFilename = "QuestionBank"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 3 :
+                RandomFilename = "guide"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 4 :
+                RandomFilename = "advertising"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 5 :
+                RandomFilename = "IDCard"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 6 :
+                RandomFilename = "file"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+            case 7 :
+                RandomFilename = "certificate"+"/"+prefixName+(Validator.isNotEmpty(prefixName)?"":(sdf.format(new Date())))+"/"+now;
+                break;
+        }
+
+        return RandomFilename;
+    }
+
     @Override
     public ResultBean callback(HttpServletRequest request) {
         JSONObject resultBean = new JSONObject();
@@ -193,7 +245,7 @@ public class OssServiceImpl implements OssService {
     public String uploadInputStream(InputStream inputStream, Integer imageStatus) throws Exception {
         try{
             for(int i=0;i<3;i++){         // 失败重试3次数
-                String path = uploadInputStreamImg(inputStream,imageStatus);
+                String path = uploadInputStreamAction(inputStream,imageStatus);
                 if(Validator.isNotEmpty(path)){
                     return path;
                 }
@@ -204,7 +256,7 @@ public class OssServiceImpl implements OssService {
         }
     }
 
-    private String uploadInputStreamImg(InputStream inputStream, Integer imageStatus) throws Exception {
+    private String uploadInputStreamAction(InputStream inputStream, Integer imageStatus) throws Exception {
         try{
             OssRequest ossRequest = new OssRequest();
             ossRequest.setImageStatus(7);
@@ -232,28 +284,42 @@ public class OssServiceImpl implements OssService {
     }
 
     @Override
-    public String uploadBase64(String fileStr) {
+    public String uploadBase64(String fileStr,OssRequest ossRequest) {
+        try{
+            for(int i=0;i<3;i++){         // 失败重试3次数
+                String path = uploadBase64Action(fileStr,ossRequest);
+                if(Validator.isNotEmpty(path)){
+                    return path;
+                }
+            }
+            return null;
+        }catch(Exception e) {
+            return null;
+        }
+
+    }
+
+
+    private String uploadBase64Action(String fileStr,OssRequest ossRequest) {
         try{
             BASE64Decoder decoder = new BASE64Decoder();
             byte[] imageByte = decoder.decodeBuffer(fileStr);
             SerialBlob serialBlob = new SerialBlob(imageByte);
             InputStream binaryStream = serialBlob.getBinaryStream();
-            OssRequest ossRequest = new OssRequest();
-            ossRequest.setImageStatus(1);
-            String fileName = ALIYUN_OSS_DIR_PREFIX+generateRandomFilename(ossRequest);
+            String fileName = ALIYUN_OSS_DIR_PREFIX+generateRandomFilename(ossRequest)+".jpg";
             ObjectMetadata metadata = new ObjectMetadata();
             metadata.setHeader("Content-Type","image/jpeg");
             PutObjectResult putObjectResult = ossClient.putObject(ALIYUN_OSS_BUCKET_NAME, fileName, binaryStream, metadata);
-    //        ossClient.shutdown();
+            //        ossClient.shutdown();
             return fileName;
         }catch (SerialException throwables) {
-            throwables.printStackTrace();
+            return null;
         } catch (SQLException throwables) {
-            throwables.printStackTrace();
+            return null;
         } catch (IOException e) {
-            e.printStackTrace();
+            return null;
         }
-        return null;
+
     }
 
 }

+ 16 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/bo/FaceQueryBo.java

@@ -17,7 +17,7 @@ import java.util.List;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@ApiModel("保利威视频信息分页查询对象")
+@ApiModel("人脸匹配")
 public class FaceQueryBo extends BaseEntity {
 
 
@@ -30,7 +30,21 @@ public class FaceQueryBo extends BaseEntity {
 	@ApiModelProperty("用户ID")
 	private Long userId;
 
-	@ApiModelProperty("图片base64地址")
+	@ApiModelProperty("人脸匹对图片base64")
 	private String ImageA;
 
+	@ApiModelProperty("身份证正反面 1人像面 2国徽面")
+	private Integer CardSide;
+
+	@ApiModelProperty("身份证图片base64")
+	private String CardImageBase64;
+
+	@ApiModelProperty("身份证图片url")
+	private String CardImageUrl;
+
+	@ApiModelProperty("班级ID")
+	private Long gradeId;
+
+	@ApiModelProperty("订单ID")
+	private Long orderGoodsId;
 }

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/bo/InvoiceQueryBo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.tencentcloud.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ *
+ * @author hjl
+ * @date 2021-06-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("发票")
+public class InvoiceQueryBo extends BaseEntity {
+
+
+	@ApiModelProperty("发票地址")
+	private String ImageUrl;
+
+
+	@ApiModelProperty("班级ID")
+	private Long gradeId;
+
+}

+ 8 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/service/IFaceService.java

@@ -3,10 +3,17 @@ package com.zhongzheng.modules.tencentcloud.service;
 
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.zhongzheng.modules.tencentcloud.bo.FaceQueryBo;
+import com.zhongzheng.modules.tencentcloud.bo.InvoiceQueryBo;
+
+import java.util.Map;
 
 public interface IFaceService {
 
 
-    Integer CompareFace(FaceQueryBo bo) throws TencentCloudSDKException;
+    Integer CompareFace(FaceQueryBo bo);
+
+    Map<String,String> IDCardOCR(FaceQueryBo bo);
+
+    Map<String,String> VatInvoiceOCR(InvoiceQueryBo bo);
 
 }

+ 99 - 11
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/service/impl/FaceServiceImpl.java

@@ -16,10 +16,22 @@ import com.tencentcloudapi.faceid.v20180301.models.GetDetectInfoResponse;
 import com.tencentcloudapi.iai.v20200303.IaiClient;
 import com.tencentcloudapi.iai.v20200303.models.CompareFaceRequest;
 import com.tencentcloudapi.iai.v20200303.models.CompareFaceResponse;
+import com.tencentcloudapi.ocr.v20181119.OcrClient;
+import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest;
+import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse;
+import com.tencentcloudapi.ocr.v20181119.models.VatInvoiceOCRRequest;
+import com.tencentcloudapi.ocr.v20181119.models.VatInvoiceOCRResponse;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.file.ImageUtils;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
+import com.zhongzheng.modules.base.bo.UserProfileFit;
+import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
+import com.zhongzheng.modules.base.service.IUserProfileService;
+import com.zhongzheng.modules.base.vo.UserProfileVo;
 import com.zhongzheng.modules.tencentcloud.bo.FaceQueryBo;
+import com.zhongzheng.modules.tencentcloud.bo.InvoiceQueryBo;
 import com.zhongzheng.modules.tencentcloud.service.IFaceService;
 import com.zhongzheng.modules.user.service.IUserOcrService;
 import com.zhongzheng.modules.user.service.IUserService;
@@ -27,7 +39,11 @@ import com.zhongzheng.modules.user.vo.UserVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import springfox.documentation.spring.web.json.Json;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
 
 @Service
@@ -48,37 +64,109 @@ public class FaceServiceImpl implements IFaceService {
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IUserProfileService iUserProfileService;
+
 
     @Override
     public Integer CompareFace(FaceQueryBo bo){
         try{
-            UserVo userVo = iUserService.queryById(bo.getUserId());
+            if(Validator.isEmpty(bo.getOrderGoodsId())){
+                throw new CustomException("缺少参数");
+            }
+           /* UserVo userVo = iUserService.queryById(bo.getUserId());
             if(Validator.isEmpty(userVo)){
                 return 0;
-            }
-            String oneInchPhotos = userVo.getOneInchPhotos(); //一寸照片
-            if(Validator.isEmpty(oneInchPhotos)){
+            }*/
+            UserProfileQueryBo userProfileQueryBo = new UserProfileQueryBo();
+            userProfileQueryBo.setUserId(bo.getUserId());
+            userProfileQueryBo.setOrderGoodsId(bo.getOrderGoodsId());
+            userProfileQueryBo.setTypeStatus(1L);
+            UserProfileVo info = iUserProfileService.getInfo(userProfileQueryBo);
+
+            if(Validator.isEmpty(info)){
                 //没有无需匹配
                 return 101;
             }
+            Map<String, String> maps = JSONObject.parseObject(info.getKeyValue(),Map.class);
+
+            String oneInchPhotos = JSONObject.parseObject(String.valueOf(maps.get("recent_photos")), UserProfileFit.class).getValue(); //一寸照片
+
             oneInchPhotos =ossHost+"/"+oneInchPhotos;
             Credential cred = new Credential(SecretId, SecretKey);
             ClientProfile clientProfile = new ClientProfile();
             clientProfile.setSignMethod(clientProfile.SIGN_TC3_256);
             IaiClient iaiClient = new IaiClient(cred,"ap-guangzhou");
             CompareFaceRequest faceRequest = new CompareFaceRequest();
-            faceRequest.setImageA(bo.getImageA());
-            faceRequest.setUrlB(oneInchPhotos);
-       //     faceRequest.setUrlA("https://file-dev.xyyxt.net/oss/images/avatar/20220303/1646295379430_725448525");
-       //     faceRequest.setUrlB("https://file-dev.xyyxt.net/oss/images/avatar/20220303/1646295301022_1332431765");
+            faceRequest.setImageA(bo.getImageA()); //学习拍照
+            faceRequest.setUrlB(oneInchPhotos); //一寸近照
             faceRequest.setQualityControl(4L);
             CompareFaceResponse response = iaiClient.CompareFace(faceRequest);
-            System.out.println("结果");
-            System.out.println(response.getScore());
             return response.getScore().intValue();
         }catch (TencentCloudSDKException e){
+            System.out.println("错误"+e.getMessage());
             return 0;
-        //    System.out.println("结果"+e.getMessage());
         }
     }
+
+    @Override
+    public Map<String,String> IDCardOCR(FaceQueryBo bo) {
+        try{
+            Credential cred = new Credential(SecretId, SecretKey);
+            OcrClient client = new OcrClient(cred, "ap-guangzhou");
+            IDCardOCRRequest req = new IDCardOCRRequest();
+            if(Validator.isNotEmpty(bo.getCardImageUrl())){
+                req.setImageUrl(bo.getCardImageUrl());
+            }else{
+                req.setImageBase64(bo.getCardImageBase64());
+            }
+            if(Validator.isNotEmpty(bo.getCardSide())){
+                if(bo.getCardSide()==1){
+                    req.setCardSide("FRONT");
+                }
+                if(bo.getCardSide()==2){
+                    req.setCardSide("BACK");
+                }
+            }
+            Map<String,String> rs = new HashMap<>();
+            req.setConfig("{\"CropIdCard\":true}");
+            IDCardOCRResponse resp = client.IDCardOCR(req);
+            String IdNum = resp.getIdNum();
+            String AdvancedInfo = resp.getAdvancedInfo();
+            String IdCard =  JSONObject.parseObject(AdvancedInfo).getString("IdCard");
+            if(Validator.isEmpty(IdCard)){
+                return null;
+            }
+            OssRequest ossRequest = new OssRequest();
+            ossRequest.setUserId(bo.getUserId());
+            ossRequest.setGradeId(bo.getGradeId());
+            ossRequest.setImageStatus(5);
+            String ossPath = ossService.uploadBase64(IdCard,ossRequest);
+            rs.put("IdNum",IdNum);
+            rs.put("IdImgPath",ossPath);
+            return rs;
+        }catch (TencentCloudSDKException e){
+            System.out.println("错误"+e.getMessage());
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, String> VatInvoiceOCR(InvoiceQueryBo bo) {
+        try{
+            if(Validator.isEmpty(bo.getImageUrl())){
+                throw new CustomException("缺少参数");
+            }
+            Credential cred = new Credential(SecretId, SecretKey);
+            OcrClient client = new OcrClient(cred, "ap-guangzhou");
+            VatInvoiceOCRRequest req = new VatInvoiceOCRRequest();
+            req.setIsPdf(true);
+            req.setImageUrl(ossHost+"/"+bo.getImageUrl());
+            VatInvoiceOCRResponse resp = client.VatInvoiceOCR(req);
+        }catch (TencentCloudSDKException e){
+            System.out.println("错误"+e.getMessage());
+        }
+
+        return null;
+    }
 }