Sfoglia il codice sorgente

Merge branch 'branch-nt-2022-12-27' of https://git.flowbb.cn/RK-Dev/fqgz-server into branch-nt-2022-12-27

humuyu 2 anni fa
parent
commit
7792fba893
32 ha cambiato i file con 672 aggiunte e 386 eliminazioni
  1. 1 0
      eladmin-common/src/main/java/me/zhengjie/base/ResultCode.java
  2. 5 3
      eladmin-common/src/main/java/me/zhengjie/utils/RedisUtils.java
  3. 9 2
      eladmin-system/src/main/java/me/zhengjie/application/admin/controller/AdminOrderController.java
  4. 1 0
      eladmin-system/src/main/java/me/zhengjie/application/admin/controller/vo/FaceCompareRsp.java
  5. 1 1
      eladmin-system/src/main/java/me/zhengjie/application/admin/service/AdminOrderService.java
  6. 7 8
      eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/AdminOrderServiceImpl.java
  7. 10 4
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankAuthController.java
  8. 31 2
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankNotarizeController.java
  9. 2 1
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankOrderController.java
  10. 1 0
      eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/BankOrderServiceImpl.java
  11. 2 10
      eladmin-system/src/main/java/me/zhengjie/base/file/AbstractFileHandle.java
  12. 0 174
      eladmin-system/src/main/java/me/zhengjie/base/file/FaceMinioFileHandle.java
  13. 3 0
      eladmin-system/src/main/java/me/zhengjie/base/file/FileHandle.java
  14. 6 0
      eladmin-system/src/main/java/me/zhengjie/base/file/LocalFileHandle.java
  15. 0 2
      eladmin-system/src/main/java/me/zhengjie/base/mq/RedisCacheConfig.java
  16. 2 2
      eladmin-system/src/main/java/me/zhengjie/base/sms/CreateCloudRecording.java
  17. 15 10
      eladmin-system/src/main/java/me/zhengjie/base/util/BaiduServiceUtil.java
  18. 56 0
      eladmin-system/src/main/java/me/zhengjie/base/util/FileUploadUtil.java
  19. 3 1
      eladmin-system/src/main/java/me/zhengjie/base/util/HandwritingUtil.java
  20. 11 11
      eladmin-system/src/main/java/me/zhengjie/base/util/JuheServiceUtil.java
  21. 1 1
      eladmin-system/src/main/java/me/zhengjie/base/util/TencentServiceUtil.java
  22. 77 0
      eladmin-system/src/main/java/me/zhengjie/base/util/baidu/Base64Util.java
  23. 72 0
      eladmin-system/src/main/java/me/zhengjie/base/util/baidu/FileUtil.java
  24. 23 21
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/ThirdPartyInterfaceRepository.java
  25. 4 0
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/ContractOrderEntity.java
  26. 4 4
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/ThirdPartyInterfaceEntity.java
  27. 0 3
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/UserAXQInfoEntity.java
  28. 2 6
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/mapper/ThirdPartyInterfaceMapper.java
  29. 312 117
      eladmin-system/src/main/java/me/zhengjie/domain/notary/impl/NotaryDomainImpl.java
  30. 5 1
      eladmin-system/src/main/resources/config/application-nt-test.yml
  31. 5 1
      eladmin-system/src/main/resources/config/application-nt.yml
  32. 1 1
      eladmin-system/src/main/resources/mapper/ThirdPartyInterfaceMapper.xml

+ 1 - 0
eladmin-common/src/main/java/me/zhengjie/base/ResultCode.java

@@ -128,6 +128,7 @@ public enum ResultCode {
     DICT_EXIST_DEPEND(40014, "该字典数据存在详情依赖,不允许删除"),
     DICT_DETAIL_LOCK(40015, "该字典数据被锁定,不允许修改或删除"),
     DEPART_CODE_EXISTED_WITH_ARGS(40016, "组织机构编码【{0}】系统已存在"),
+    IMAGE_NOT_STANDARD(40017,"请保持人脸居中"),
 
     /* 数据错误:50001-599999 */
     RESULT_DATA_NONE(50001, "数据未找到"),

+ 5 - 3
eladmin-common/src/main/java/me/zhengjie/utils/RedisUtils.java

@@ -705,7 +705,9 @@ public class RedisUtils {
         log.debug("缓存删除数量:" + count + "个");
         log.debug("--------------------------------------------");
     }
-//    public void increment() {
-//    	redisTemplate.ops
-//    }
+    public void increment(String key) {
+        ValueOperations<Object, Object> objectObjectValueOperations = redisTemplate.opsForValue();
+        objectObjectValueOperations.increment(key);
+        expire(key,30,TimeUnit.MINUTES);
+    }
 }

+ 9 - 2
eladmin-system/src/main/java/me/zhengjie/application/admin/controller/AdminOrderController.java

@@ -10,9 +10,15 @@ import me.zhengjie.application.admin.controller.vo.*;
 import me.zhengjie.application.admin.service.AdminOrderService;
 import me.zhengjie.application.admin.service.dto.CompareImageDto;
 import me.zhengjie.base.*;
+import me.zhengjie.base.file.FileHandleVo;
 import me.zhengjie.base.util.BeanCopyUtils;
+import me.zhengjie.base.util.FileUploadUtil;
+import me.zhengjie.base.util.JuheServiceUtil;
 import me.zhengjie.base.util.TencentServiceUtil;
-import me.zhengjie.dao.mybatis.entity.ThirdPartyInterfaceEntity;
+import me.zhengjie.dao.mybatis.entity.FileInfoEntity;
+import me.zhengjie.dao.mybatis.entity.FaceCompareEntity;
+import me.zhengjie.domain.notary.impl.NotaryDomainImpl;
+import me.zhengjie.utils.StringUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -40,6 +46,7 @@ import java.util.List;
 public class AdminOrderController {
 
 	private final AdminOrderService adminOrderService;
+	private final NotaryDomainImpl notaryDomain;
 
 	/**
 	 * 公证订单 查询
@@ -251,7 +258,7 @@ public class AdminOrderController {
 	}
 
 	@RequestMapping("/getFaceCompareList")
-	public AppBaseResponse<List<ThirdPartyInterfaceEntity>> getFaceCompareList(@RequestBody FaceCompareReq thirdPartyReq){
+	public AppBaseResponse getFaceCompareList(@RequestBody FaceCompareReq thirdPartyReq){
 		return adminOrderService.getThird(thirdPartyReq);
 	}
 

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/application/admin/controller/vo/FaceCompareRsp.java

@@ -8,6 +8,7 @@ import java.util.Date;
 public class FaceCompareRsp {
     private Long id;
     private String businessNo;
+    private String consultNo;
     private String message;
     private Integer result;
     private String score;

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/application/admin/service/AdminOrderService.java

@@ -76,7 +76,7 @@ public interface AdminOrderService {
      */
     AppBaseResponse faceCompare(CompareImageDto compareImageDto);
 
-    AppBaseResponse<List<ThirdPartyInterfaceEntity>> getThird(FaceCompareReq thirdPartyReq);
+    AppBaseResponse<List<FaceCompareEntity>> getThird(FaceCompareReq thirdPartyReq);
 //
 //    /**
 //     * 查询全部

+ 7 - 8
eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/AdminOrderServiceImpl.java

@@ -21,7 +21,7 @@ import me.zhengjie.base.util.StatusEnum.NotaryStatusEnum;
 import me.zhengjie.dao.mybatis.ContractOrderRepository;
 import me.zhengjie.dao.mybatis.ModelRepository;
 import me.zhengjie.dao.mybatis.OrderFileRepository;
-import me.zhengjie.dao.mybatis.ThirdPartyInterfaceRepository;
+import me.zhengjie.dao.mybatis.FaceCompareRepository;
 import me.zhengjie.dao.mybatis.entity.*;
 import me.zhengjie.dao.mybatis.mapper.*;
 import me.zhengjie.domain.img.CompareImageDomain;
@@ -44,7 +44,6 @@ import org.springframework.util.StringUtils;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -117,7 +116,7 @@ public class AdminOrderServiceImpl implements AdminOrderService {
     @Autowired
     private DictDetailService dictDetailService;
     @Autowired
-    private ThirdPartyInterfaceRepository thirdPartyInterfaceRepository;
+    private FaceCompareRepository thirdPartyInterfaceRepository;
 
 
     @Override
@@ -176,7 +175,8 @@ public class AdminOrderServiceImpl implements AdminOrderService {
         String maxRole = userDomain.getUserMaxRole();
         if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getIssuedStartDate())){
             qw.ge("issued_time",req.getIssuedStartDate());
-        }else if(org.apache.commons.lang3.StringUtils.isNotBlank(req.getIssuedEndDate())){
+        }
+        if(org.apache.commons.lang3.StringUtils.isNotBlank(req.getIssuedEndDate())){
             qw.le("issued_time",req.getIssuedEndDate());
         }
         if ("超级管理员".equals(maxRole)) {
@@ -390,12 +390,11 @@ public class AdminOrderServiceImpl implements AdminOrderService {
     @Override
     public AppBaseResponse getThird(FaceCompareReq req) {
         AppBaseResponse<List<FaceCompareRsp>> response = new AppBaseResponse<>();
-        IPage<ThirdPartyInterfaceEntity> page = new Page<>(req.getIndex(), req.getSize());
-        QueryWrapper<ThirdPartyInterfaceEntity> qw = new QueryWrapper<>();
+        IPage<FaceCompareEntity> page = new Page<>(req.getIndex(), req.getSize());
+        QueryWrapper<FaceCompareEntity> qw = new QueryWrapper<>();
         Integer result = req.getResult();
         String idCard = req.getIdCard();
         String name = req.getName();
-        qw.eq("type","face_compare");
         if (!ObjectUtils.isEmpty(result)){
             qw.eq("result",result);
         }
@@ -407,7 +406,7 @@ public class AdminOrderServiceImpl implements AdminOrderService {
         }
         String format = DateFormatUtils.format(new Date());
         qw.between("create_time",format+" 00:00:00",format+" 23:59:59");
-
+        qw.orderByDesc("create_time");
         List<FaceCompareRsp> faceCompareRspList = thirdPartyInterfaceRepository.page(page,qw);
 
         response.setData(new AppResultData<List<FaceCompareRsp>>(faceCompareRspList,new me.zhengjie.base.Page(req.getIndex(), req.getSize(), (int) page.getTotal())));

+ 10 - 4
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankAuthController.java

@@ -5,12 +5,10 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.annotation.rest.AnonymousGetMapping;
 import me.zhengjie.annotation.rest.AnonymousPostMapping;
 import me.zhengjie.application.bank.BaseController;
-import me.zhengjie.application.bank.controller.vo.BankLoginVO;
-import me.zhengjie.application.bank.controller.vo.FileInfoVO;
-import me.zhengjie.application.bank.controller.vo.FileUploadVO;
-import me.zhengjie.application.bank.controller.vo.ImageUploadVO;
+import me.zhengjie.application.bank.controller.vo.*;
 import me.zhengjie.application.bank.service.BankLoginService;
 import me.zhengjie.application.bank.service.FileInfoService;
 import me.zhengjie.base.ResponseDTO;
@@ -22,6 +20,8 @@ import me.zhengjie.base.util.StatusEnum.StepStatusEnum;
 import me.zhengjie.base.util.TencentServiceUtil;
 import me.zhengjie.dao.mybatis.UserAXQInfoRepository;
 import me.zhengjie.dao.mybatis.entity.UserAXQInfoEntity;
+import me.zhengjie.domain.notary.NotaryDomain;
+import me.zhengjie.domain.notary.impl.NotaryDomainImpl;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -130,6 +131,9 @@ public class BankAuthController extends BaseController {
 //            return ResponseDTO.error(ResultCode.BUSINESS_PROCESS_ERROR);
 //        }
         // FIL
+        /*System.out.println("#######################");
+        System.out.println(image.getBase64());
+        System.out.println("#######################");*/
         if (StringUtils.isBlank(image.getOrder())) {
             image.setOrder("1");
         }
@@ -137,7 +141,9 @@ public class BankAuthController extends BaseController {
         if ("4".equals(image.getStep())) {
             String type = environment.getProperty("fqgz.bank.handwriting");
             String ocrName = HandwritingUtil.getHandwritingText(type, image.getBase64());
+            log.info("手写签名为:" + ocrName);
             UserAXQInfoEntity entity = userAXQInfoRepository.getUserAXQInfoWithIdcard(image.getIdCard());
+            log.info(ocrName);
             if (!ocrName.equals(entity.getUserName())) {
                 return ResponseDTO.error(ResultCode.HANDWRITING_FAIL);
             }

+ 31 - 2
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankNotarizeController.java

@@ -1,14 +1,15 @@
 package me.zhengjie.application.bank.controller;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.arcsoft.face.*;
 import com.arcsoft.face.enums.ErrorInfo;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.annotation.rest.AnonymousGetMapping;
 import me.zhengjie.annotation.rest.AnonymousPostMapping;
 import me.zhengjie.application.admin.service.SmsTemplateService;
 import me.zhengjie.application.bank.BaseController;
@@ -25,15 +26,18 @@ import me.zhengjie.base.util.FileUploadUtil;
 import me.zhengjie.base.util.UUIDGenerator;
 import me.zhengjie.base.util.tencent.h5face.SdkTest;
 import me.zhengjie.dao.mybatis.OrderFileRepository;
+import me.zhengjie.dao.mybatis.FaceCompareRepository;
 import me.zhengjie.dao.mybatis.entity.OrderFileEntity;
+import me.zhengjie.dao.mybatis.entity.FaceCompareEntity;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @Validated
 @RestController
 @RequestMapping("${fqgz.bank.app.url-prefix}")
@@ -46,6 +50,7 @@ public class BankNotarizeController extends BaseController {
 	private final BankNotarizeService bankNotarizeService;
 	private final TencentHumanFaceVerify faceVerify;
 	private final SmsTemplateService smsTemplateService;
+	private final FaceCompareRepository thirdPartyInterfaceRepository;
 	private final RedisTemplate<String, String> redisTemplate;
 
 	/**
@@ -220,6 +225,30 @@ public class BankNotarizeController extends BaseController {
 		errorCode = faceEngine.unInit();
 		return ResponseDTO.success();
 	}
+	@RequestMapping("/isFaceCompare")
+	public ResponseDTO<?> isFaceCompare(@RequestBody String json){
+		// 这里需要先判断公证员是否在线
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String userName = jsonObj.getString("userName");
+		String idCard = jsonObj.getString("idCard");
+		String businessNo = jsonObj.getString("businessNo");
+		if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(idCard)) {
+			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+		}
+		ResponseDTO<?> result = bankNotarizeService.onlineNotary(businessNo);
+		if (!result.isSuccess()) {
+			return result;
+		}
+		//判断传入的当事人 是否做过人脸核身
+		QueryWrapper<FaceCompareEntity> thirdPartyInterfaceEntityQueryWrapper = new QueryWrapper<>();
+		thirdPartyInterfaceEntityQueryWrapper.eq("name",userName).eq("id_card",idCard);
+		List<FaceCompareEntity> list = thirdPartyInterfaceRepository.getList(thirdPartyInterfaceEntityQueryWrapper);
+		if (CollectionUtil.isEmpty(list)){
+			return ResponseDTO.error(ResultCode.RESULT_DATA_NONE);
+		}
+		return ResponseDTO.success();
+	}
+
 
 	/**
 	 * 银行客户经理的人脸照片比对

+ 2 - 1
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankOrderController.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.annotation.rest.AnonymousPostMapping;
 import me.zhengjie.application.bank.BaseController;
 import me.zhengjie.application.bank.controller.vo.BankOrderVO;
 import me.zhengjie.application.bank.service.BankOrderService;
@@ -49,7 +50,7 @@ public class BankOrderController extends BaseController {
      *
      * @return
      */
-    @RequestMapping("/save")
+    @AnonymousPostMapping("/save")
     public ResponseDTO<String> saveOrder(@RequestBody @Valid BankOrderVO vo) {
         if (vo.getJointFlag() != null && vo.getJointFlag() == OrderConstant.JOINT_FLAG_TRUE) {
             if (StringUtils.isEmpty(vo.getJointName()) || StringUtils.isEmpty(vo.getJointIdCard()) || StringUtils.isEmpty(vo.getJointPhone()) || StringUtils.isEmpty(vo.getJointSex()) || StringUtils.isEmpty(vo.getJointIdcardFrontPic()) || StringUtils.isEmpty(vo.getJointIdcardBackPic())) {

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/BankOrderServiceImpl.java

@@ -88,6 +88,7 @@ public class BankOrderServiceImpl implements BankOrderService {
         saveOrder.setBankName(bank.getBankName());
         saveOrder.setNotaryOfficeId(officeXbank.getNotaryOfficeId());
         saveOrder.setAutoGenerate(notaryOfficeEntity.getAutoGenerate());
+        saveOrder.setBirth(DateFormatUtils.format(vo.getBirth(), DateFormatUtils.DATE_PATTERN8));
         saveOrder.setStatus(OrderConstant.ORDER_STATUS_UNSUBMIT);
         ContractOrderEntity curOrder = contractOrderRepository.getContractOrderWithBizNo(vo.getBusinessNo());
         if (curOrder == null) {

+ 2 - 10
eladmin-system/src/main/java/me/zhengjie/base/file/AbstractFileHandle.java

@@ -11,23 +11,15 @@ import me.zhengjie.base.util.FileUploadUtil;
 public abstract class AbstractFileHandle implements FileHandle, ApplicationContextAware {
 
 	//图片预览
-	@Value("${app.minio.preview:https://fqgz.flowbb.cn}")
+	@Value("${app.minio.preview}")
 	protected String appMinioPreview;
 
-	private static final String APPMINIOPREVIEW = "https://fqgz.flowbb.cn";
-
 	ApplicationContext applicationContext;
 
 	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
 		this.applicationContext = applicationContext;
 		// 设置应用
-		FileHandle fileHandle=null;
-		if (APPMINIOPREVIEW.equals(appMinioPreview)){
-			fileHandle = applicationContext.getBean(FaceMinioFileHandle.class);
-		}else {
-			fileHandle = applicationContext.getBean(MinioFileHandle.class);
-		}
-
+		FileHandle fileHandle = applicationContext.getBean(FileHandle.class);
 		FileUploadUtil.setFileHandle(fileHandle);
 	}
 	/**

+ 0 - 174
eladmin-system/src/main/java/me/zhengjie/base/file/FaceMinioFileHandle.java

@@ -1,174 +0,0 @@
-package me.zhengjie.base.file;
-
-import cn.hutool.core.io.IoUtil;
-import io.minio.MinioClient;
-import io.minio.ObjectStat;
-import io.minio.PutObjectOptions;
-import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.base.config.AppConfigInfo;
-import me.zhengjie.dao.mybatis.entity.FileInfoEntity;
-import me.zhengjie.dao.mybatis.mapper.FileInfoMapper;
-import org.apache.commons.io.FileUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.*;
-
-@Slf4j
-@Primary
-@Component
-public class FaceMinioFileHandle extends AbstractFileHandle {
-	// minio的连接bucketName
-	@Value("mytest")
-	private String bucketName;
-	// 设置连接minio的url
-	@Value("http://124.222.192.60:9000")
-	public String appMinioUrl;
-	// minio的连接accesskey
-	@Value("minioadmin")
-	public String appMinioAccesskey;
-	// minio的连接secretkey
-	@Value("minioadmin")
-	public String appMinioSecretkey;
-
-	@Autowired
-	public FileInfoMapper fileInfoMapper;
-
-	private MinioClient minioClient;
-
-	@PostConstruct
-	private void init() throws Exception {
-		try {
-			if (minioClient == null) {
-				log.info("minioClient create start");
-				minioClient = new MinioClient(appMinioUrl, appMinioAccesskey, appMinioSecretkey);
-				log.info("minioClient create end");
-				// 判断桶是否已经存在
-				log.info("开始创建minio的:");
-				createBucket();
-			}
-		} catch (Exception e) {
-			log.error("连接MinIO服务器异常:{}", e);
-			throw e;
-		}
-	}
-
-	/**
-	 * @Title: createBucket
-	 * @Description: (创建bucket)
-	 * @author humuyu [bucketName] 桶名
-	 */
-	public void createBucket() {
-		try {
-			if (!minioClient.bucketExists(bucketName)) {
-				minioClient.makeBucket(bucketName);
-			}
-		} catch (Exception e) {
-			log.error("创建桶失败:{}", e);
-		}
-	}
-
-	/**
-	 * 通过流上传文件
-	 *
-	 * @param bucketName  存储桶
-	 * @param objectName  文件对象
-	 * @param inputStream 文件流
-	 */
-	public void uploadFileStream(FileHandleVo file) throws Exception {
-		int fileSize = file.getInputStream().available();
-		PutObjectOptions options = new PutObjectOptions(fileSize, -1);
-		options.setContentType(file.getContentType());
-		minioClient.putObject(bucketName, file.getFilePath(), file.getInputStream(), options);
-	}
-
-	public void uploadfilePath(FileHandleVo file) throws Exception {
-		InputStream is = new FileInputStream(file.getFilePath());
-		long size = is.available();
-		PutObjectOptions options = new PutObjectOptions(size, -1);
-		options.setContentType(file.getContentType());
-		minioClient.putObject(bucketName, file.getSourceFilePath(), is, options);
-		if (is != null) {
-			is.close();
-		}
-//
-	}
-
-	public InputStream getObject(String objectName) throws Exception {
-		return minioClient.getObject(bucketName, objectName);
-	}
-
-	/**
-	 * @param bucketName bucket名称
-	 * @param objectName ⽂件名称
-	 * @param expires    过期时间 <=7
-	 * @return url
-	 * @Title: getObjectURL
-	 * @Description: (获取 ⽂ 件外链) [bucketName 桶名, objectName 文件名, expires 时间<=1小时]
-	 */
-	public String getObjectUrl(String keyName) throws Exception {
-		return minioClient.presignedGetObject(bucketName, keyName, 3600);
-	}
-
-	/**
-	 * 自定义url
-	 * 
-	 * @param fileKey 文件的
-	 * @return
-	 */
-	public String getCustomUrl(String fileKey, String filePath) {
-		try {
-			// return fileHandle.getPreviewUrl(fileKey);
-			InputStream input = minioClient.getObject(bucketName, fileKey);
-			byte[] b = IoUtil.readBytes(input);
-			String uploadPath = AppConfigInfo.APP_UPLOAD_PATH;
-			if (!uploadPath.endsWith("/")) {
-				uploadPath = uploadPath + "/";
-			}
-			String transferFilePath = uploadPath + filePath;
-			FileUtils.writeByteArrayToFile(new File(transferFilePath), b);
-			return appMinioPreview +"/image/"+ filePath;
-		} catch (Exception e) {
-			log.error("图片预览失败:" + e.getLocalizedMessage());
-			return null;
-		}
-	}
-
-	/**
-	 * 根据文件路径从minio获取文件
-	 * @param filePath
-	 * @return
-	 * @throws Exception
-	 */
-	public File getFileWithPath(String filePath) throws Exception {
-		InputStream inputStream = minioClient.getObject(bucketName, filePath);
-		File file = File.createTempFile("compare",".jpeg");
-		file.deleteOnExit();
-		OutputStream outputStream = new FileOutputStream(file);
-		int bytesRead = 0;
-		byte[] buffer = new byte[8192];
-		while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
-			outputStream.write(buffer, 0, bytesRead);
-		}
-		inputStream.close();
-		outputStream.close();
-		return file;
-	}
-
-	public byte[] getByte(String fileId) throws Exception {
-		FileInfoEntity fileInfo = fileInfoMapper.selectById(fileId);
-		String path = fileInfo.getPath();
-		InputStream inputStream = this.getObject(path);
-		// 这里已经关闭流,不需要手动关闭
-		return IoUtil.readBytes(inputStream);
-	}
-
-	public long getSize(String keyName) throws Exception {
-		ObjectStat stat = minioClient.statObject(bucketName, keyName);
-		long length = stat.length();
-		return length;
-	}
-}

+ 3 - 0
eladmin-system/src/main/java/me/zhengjie/base/file/FileHandle.java

@@ -1,5 +1,6 @@
 package me.zhengjie.base.file;
 
+import java.io.File;
 import java.io.InputStream;
 
 public interface FileHandle {
@@ -62,4 +63,6 @@ public interface FileHandle {
 	public long getSize(String keyName) throws Exception;
 
 	public String getCustomUrl(String fileKey, String filePath) throws Exception;
+
+	public File getFileWithPath(String fileKey)throws Exception;
 }

+ 6 - 0
eladmin-system/src/main/java/me/zhengjie/base/file/LocalFileHandle.java

@@ -1,5 +1,6 @@
 package me.zhengjie.base.file;
 
+import java.io.File;
 import java.io.InputStream;
 
 import org.springframework.stereotype.Component;
@@ -54,4 +55,9 @@ public class LocalFileHandle extends AbstractFileHandle {
 		return null;
 	}
 
+	@Override
+	public File getFileWithPath(String fileKey) throws Exception {
+		return null;
+	}
+
 }

+ 0 - 2
eladmin-system/src/main/java/me/zhengjie/base/mq/RedisCacheConfig.java

@@ -14,9 +14,7 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
 @EnableCaching
 public class RedisCacheConfig {
 	public final static String CHANNEL_HTML_PDF = "channel:html_pdf";
-
 	public final static String CHANNEL_WEB_SOCKET = "channel:web_socket";
-
 	public final static String NOTE_BOOK_SOCKET = "channel:note_book";
 
 	@Bean

+ 2 - 2
eladmin-system/src/main/java/me/zhengjie/base/sms/CreateCloudRecording.java

@@ -12,8 +12,8 @@ import org.springframework.stereotype.Component;
 
 @Component
 public class CreateCloudRecording {
-	private final static Long VIDEO_WITH = 640L;
-	private final static Long VIDEO_HEIGHT = 480L;
+	private final static Long VIDEO_WITH = 1280L;
+	private final static Long VIDEO_HEIGHT = 720L;
 
 	/**
 	 * 停止录制

File diff suppressed because it is too large
+ 15 - 10
eladmin-system/src/main/java/me/zhengjie/base/util/BaiduServiceUtil.java


+ 56 - 0
eladmin-system/src/main/java/me/zhengjie/base/util/FileUploadUtil.java

@@ -6,6 +6,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Iterator;
+import java.util.UUID;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReader;
@@ -124,6 +125,61 @@ public class FileUploadUtil {
 		}
 	}
 
+	public static String saveFaceImage(String imgStr) {
+
+		if (imgStr == null) // 图像数据为空
+			return null;
+		try {
+			String suffix = imageFileSuffix(imgStr);
+			if (StringUtils.isNotEmpty(suffix)) {
+				// 去掉data:image/jpeg;这种类型的
+				String[] base64Prefix = imgStr.split("base64,");
+				if (base64Prefix != null && base64Prefix.length > 1) {
+					imgStr = base64Prefix[1];
+				}
+			}else {
+				suffix = "jpeg";
+			}
+			// Base64解码
+			byte[] b = Base64.decodeBase64(imgStr);
+			for (int i = 0; i < b.length; ++i) {
+				if (b[i] < 0) {// 调整异常数据
+					b[i] += 256;
+				}
+			}
+			if (StringUtils.isEmpty(suffix)) {
+				suffix = getFormatName(b);
+			}
+			// TODO 这里再判断,通过二进制,如果还是失败抛出异常,
+			// 如果不存在,创建文件夹
+			String uuid = uuid();
+			// 拼接文件路径
+			String fileName = uuid + "." + suffix;
+			// 图片的路径
+			String imagePath = "facecompare" + "/" + fileName;
+			// 这里目前只会说图片的
+			String contentType = "image/" + suffix;
+			uploadFile(imagePath, contentType, b);
+			// FileUtils.writeByteArrayToFile(fullPath, b);
+			return imagePath;
+		} catch (Exception e) {
+			log.error("上传图片失败:" + e.getLocalizedMessage());
+			return null;
+		}
+	}
+	public static File getFileWithPath(String fileKey){
+		try {
+			return fileHandle.getFileWithPath(fileKey);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	public static String uuid() {
+
+		return UUID.randomUUID().toString().replace("-", "");
+	}
+
 	public static String uploadFile(FileUploadVO file, MultipartFile partFile) {
 		if (file.getFileUpload() == null) {
 			return null;

File diff suppressed because it is too large
+ 3 - 1
eladmin-system/src/main/java/me/zhengjie/base/util/HandwritingUtil.java


+ 11 - 11
eladmin-system/src/main/java/me/zhengjie/base/util/JuheServiceUtil.java

@@ -10,9 +10,9 @@ import java.io.IOException;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
-import me.zhengjie.dao.mybatis.entity.ThirdPartyInterfaceEntity;
+import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.dao.mybatis.entity.FaceCompareEntity;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpException;
 import org.apache.commons.httpclient.HttpStatus;
@@ -23,8 +23,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
+@Slf4j
 public class JuheServiceUtil {
-    private static final Logger logger = LoggerFactory.getLogger(HttpRequestUtil.class);
+    private static final Logger logger = LoggerFactory.getLogger(JuheServiceUtil.class);
 
     public static final String UTF8 = "UTF-8";
     private static final String EMPTY = "";
@@ -64,9 +65,8 @@ public class JuheServiceUtil {
      * @param params 业务参数
      * @return String response
      */
-    public static ThirdPartyInterfaceEntity URLPost(String idCard, String realName, String base64) {
-        ThirdPartyInterfaceEntity thirdPartyInterfaceEntity = new ThirdPartyInterfaceEntity();
-        thirdPartyInterfaceEntity.setType("face_compare");
+    public static FaceCompareEntity URLPost(String idCard, String realName, String base64) {
+        FaceCompareEntity thirdPartyInterfaceEntity = new FaceCompareEntity();
         thirdPartyInterfaceEntity.setName(realName);
         thirdPartyInterfaceEntity.setIdCard(idCard);
         String response = EMPTY;
@@ -86,9 +86,9 @@ public class JuheServiceUtil {
                 JSONObject jsonObj = JSON.parseObject(response);
                 //设置结果 可能成功也可能失败
                 String reason = jsonObj.getString("reason");
-                JSONObject result = jsonObj.getJSONObject("result");
+                JSONObject result = jsonObj.getJSONObject("result");;
                 if (! "成功".equals(reason)){
-                    thirdPartyInterfaceEntity.setMessage("人脸比对次数不足");
+                    thirdPartyInterfaceEntity.setMessage(result.getString("message"));
                     thirdPartyInterfaceEntity.setResult(0);
                     return thirdPartyInterfaceEntity;
                 }
@@ -99,9 +99,9 @@ public class JuheServiceUtil {
                     return thirdPartyInterfaceEntity;
                 }
                 String score = result.getString("score");
-                if (Integer.parseInt(score) < 45) {
+                if (Integer.parseInt(score) < 80) {
                     thirdPartyInterfaceEntity.setScore(score);
-                    thirdPartyInterfaceEntity.setMessage("比对分值小于45");
+                    thirdPartyInterfaceEntity.setMessage("比对分值小于80");
                     thirdPartyInterfaceEntity.setResult(0);
                     return thirdPartyInterfaceEntity;
                 }
@@ -142,7 +142,7 @@ public class JuheServiceUtil {
             params.put("realname", realName);
             params.put("image", base64);
             params.put("key", KEY_CODE);
-            ThirdPartyInterfaceEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard,realName,base64);
+            FaceCompareEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard,realName,base64);
             System.out.println(thirdPartyInterfaceEntity);
         } catch (Exception e) {
             e.printStackTrace();

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/base/util/TencentServiceUtil.java

@@ -355,7 +355,7 @@ public class TencentServiceUtil {
      * 图片压缩
      * @throws Exception
      */
-    private static String compressImage(String filePath) throws  Exception{
+    public static String compressImage(String filePath) throws  Exception{
         File input = new File(filePath);
         BufferedImage image = ImageIO.read(input);
 

+ 77 - 0
eladmin-system/src/main/java/me/zhengjie/base/util/baidu/Base64Util.java

@@ -0,0 +1,77 @@
+package me.zhengjie.base.util.baidu;
+
+import java.util.Base64;
+
+/**
+ * Base64 工具类
+ */
+public class Base64Util {
+    private static final char last2byte = (char) Integer.parseInt("00000011", 2);
+    private static final char last4byte = (char) Integer.parseInt("00001111", 2);
+    private static final char last6byte = (char) Integer.parseInt("00111111", 2);
+    private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
+    private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
+    private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
+    private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
+
+    public Base64Util() {
+    }
+
+    public static String encode(byte[] from) {
+        StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
+        int num = 0;
+        char currentByte = 0;
+
+        int i;
+        for (i = 0; i < from.length; ++i) {
+            for (num %= 8; num < 8; num += 6) {
+                switch (num) {
+                    case 0:
+                        currentByte = (char) (from[i] & lead6byte);
+                        currentByte = (char) (currentByte >>> 2);
+                    case 1:
+                    case 3:
+                    case 5:
+                    default:
+                        break;
+                    case 2:
+                        currentByte = (char) (from[i] & last6byte);
+                        break;
+                    case 4:
+                        currentByte = (char) (from[i] & last4byte);
+                        currentByte = (char) (currentByte << 2);
+                        if (i + 1 < from.length) {
+                            currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
+                        }
+                        break;
+                    case 6:
+                        currentByte = (char) (from[i] & last2byte);
+                        currentByte = (char) (currentByte << 4);
+                        if (i + 1 < from.length) {
+                            currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
+                        }
+                }
+
+                to.append(encodeTable[currentByte]);
+            }
+        }
+
+        if (to.length() % 4 != 0) {
+            for (i = 4 - to.length() % 4; i > 0; --i) {
+                to.append("=");
+            }
+        }
+
+        return to.toString();
+    }
+
+    public static byte[] base64ToByteArray(String base64) {
+        byte[] buffer;
+        try {
+            buffer = Base64.getDecoder().decode(base64);
+            return buffer;
+        } catch (Exception e) {
+            throw new RuntimeException("base64字符串异常或地址异常\n" + e.getMessage());
+        }
+    }
+}

+ 72 - 0
eladmin-system/src/main/java/me/zhengjie/base/util/baidu/FileUtil.java

@@ -0,0 +1,72 @@
+package me.zhengjie.base.util.baidu;
+
+import java.io.*;
+
+/**
+ * 文件读取工具类
+ */
+public class FileUtil {
+
+    /**
+     * 读取文件内容,作为字符串返回
+     */
+    public static String readFileAsString(String filePath) throws IOException {
+        File file = new File(filePath);
+        if (!file.exists()) {
+            throw new FileNotFoundException(filePath);
+        } 
+
+        if (file.length() > 1024 * 1024 * 1024) {
+            throw new IOException("File is too large");
+        } 
+
+        StringBuilder sb = new StringBuilder((int) (file.length()));
+        // 创建字节输入流  
+        FileInputStream fis = new FileInputStream(filePath);  
+        // 创建一个长度为10240的Buffer
+        byte[] bbuf = new byte[10240];  
+        // 用于保存实际读取的字节数  
+        int hasRead = 0;  
+        while ( (hasRead = fis.read(bbuf)) > 0 ) {  
+            sb.append(new String(bbuf, 0, hasRead));  
+        }  
+        fis.close();  
+        return sb.toString();
+    }
+
+    /**
+     * 根据文件路径读取byte[] 数组
+     */
+    public static byte[] readFileByBytes(String filePath) throws IOException {
+        File file = new File(filePath);
+        if (!file.exists()) {
+            throw new FileNotFoundException(filePath);
+        } else {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
+            BufferedInputStream in = null;
+
+            try {
+                in = new BufferedInputStream(new FileInputStream(file));
+                short bufSize = 1024;
+                byte[] buffer = new byte[bufSize];
+                int len1;
+                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
+                    bos.write(buffer, 0, len1);
+                }
+
+                byte[] var7 = bos.toByteArray();
+                return var7;
+            } finally {
+                try {
+                    if (in != null) {
+                        in.close();
+                    }
+                } catch (IOException var14) {
+                    var14.printStackTrace();
+                }
+
+                bos.close();
+            }
+        }
+    }
+}

+ 23 - 21
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/ThirdPartyInterfaceRepository.java

@@ -2,21 +2,15 @@ package me.zhengjie.dao.mybatis;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import me.zhengjie.application.admin.controller.vo.FaceCompareRsp;
-import me.zhengjie.base.ResultCode;
-import me.zhengjie.base.file.FaceMinioFileHandle;
 import me.zhengjie.base.util.BeanCopyUtils;
-import me.zhengjie.dao.mybatis.entity.ContractOrderEntity;
+import me.zhengjie.base.util.FileUploadUtil;
 import me.zhengjie.dao.mybatis.entity.FileInfoEntity;
-import me.zhengjie.dao.mybatis.entity.ThirdPartyInterfaceEntity;
-import me.zhengjie.dao.mybatis.mapper.ContractOrderMapper;
+import me.zhengjie.dao.mybatis.entity.FaceCompareEntity;
 import me.zhengjie.dao.mybatis.mapper.FileInfoMapper;
-import me.zhengjie.dao.mybatis.mapper.ThirdPartyInterfaceMapper;
-import org.apache.commons.lang.StringUtils;
+import me.zhengjie.dao.mybatis.mapper.FaceCompareMapper;
 import org.springframework.stereotype.Component;
-import org.springframework.util.ObjectUtils;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -24,29 +18,24 @@ import java.util.List;
 
 @RequiredArgsConstructor
 @Component
-public class ThirdPartyInterfaceRepository {
-    private final ThirdPartyInterfaceMapper thirdPartyInterfaceMapper;
-    private final ContractOrderMapper contractOrderMapper;
+public class FaceCompareRepository {
+    private final FaceCompareMapper thirdPartyInterfaceMapper;
     private final FileInfoMapper fileInfoMapper;
-    private final FaceMinioFileHandle minioFileHandle;
-
-
-
-    public void insert(ThirdPartyInterfaceEntity thirdPartyInterfaceEntity){
+    public void insert(FaceCompareEntity thirdPartyInterfaceEntity){
         thirdPartyInterfaceEntity.setCreateTime(new Date());
         thirdPartyInterfaceMapper.insert(thirdPartyInterfaceEntity);
     }
 
-    public List<FaceCompareRsp> page(IPage<ThirdPartyInterfaceEntity> page, QueryWrapper<ThirdPartyInterfaceEntity> qw) {
-        IPage<ThirdPartyInterfaceEntity> thirdPartyInterfaceEntityIPage = thirdPartyInterfaceMapper.selectPage(page,qw);
+    public List<FaceCompareRsp> page(IPage<FaceCompareEntity> page, QueryWrapper<FaceCompareEntity> qw) {
+        IPage<FaceCompareEntity> thirdPartyInterfaceEntityIPage = thirdPartyInterfaceMapper.selectPage(page,qw);
         List<FaceCompareRsp> faceCompareRspList = new ArrayList<>();
-        for (ThirdPartyInterfaceEntity thirdPartyInterfaceEntity:thirdPartyInterfaceEntityIPage.getRecords()){
+        for (FaceCompareEntity thirdPartyInterfaceEntity:thirdPartyInterfaceEntityIPage.getRecords()){
             FaceCompareRsp faceCompareRsp = BeanCopyUtils.convertObj(thirdPartyInterfaceEntity, FaceCompareRsp.class);
             String fileId = thirdPartyInterfaceEntity.getFileId();
             FileInfoEntity fileInfoEntity = fileInfoMapper.selectById(fileId);
             String previewUrl = null;
             try {
-                previewUrl = minioFileHandle.getPreviewUrl(fileInfoEntity.getPath());
+                previewUrl = getPreview(fileInfoEntity.getPath());
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
@@ -55,4 +44,17 @@ public class ThirdPartyInterfaceRepository {
         }
         return faceCompareRspList;
     }
+
+    public String getPreview(String fileKey) {
+        String url = FileUploadUtil.getPreviewUrl(fileKey);
+        return url;
+    }
+
+    public FaceCompareEntity getOne(QueryWrapper<FaceCompareEntity> thirdPartyInterfaceEntityQueryWrapper) {
+        return thirdPartyInterfaceMapper.selectOne(thirdPartyInterfaceEntityQueryWrapper);
+    }
+
+    public List<FaceCompareEntity> getList(QueryWrapper<FaceCompareEntity> thirdPartyInterfaceEntityQueryWrapper) {
+        return thirdPartyInterfaceMapper.selectList(thirdPartyInterfaceEntityQueryWrapper);
+    }
 }

+ 4 - 0
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/ContractOrderEntity.java

@@ -106,6 +106,8 @@ public class ContractOrderEntity implements Serializable {
 
     @TableField("other_upload")
     private String otherUpload;
+    @TableField("compare_img_id")
+    private Integer compareImgId;
 
     @TableField("joint_flag")
     private Integer jointFlag;
@@ -130,6 +132,8 @@ public class ContractOrderEntity implements Serializable {
 
     @TableField("joint_residence")
     private String jointResidence;
+    @TableField("joint_compare_img_id")
+    private Integer jointCompareImgId;
 
     @TableField("bank_id")
     private String bankId;

+ 4 - 4
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/ThirdPartyInterfaceEntity.java

@@ -12,12 +12,14 @@ import java.util.Date;
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@TableName("third_party_interface")
-public class ThirdPartyInterfaceEntity {
+@TableName("face_compare")
+public class FaceCompareEntity {
     @TableId(value = "id",type = IdType.AUTO)
     private Long id;
     @TableField("business_no")
     private String businessNo;
+    @TableField("consult_no")
+    private String consultNo;
     @TableField("message")
     private String message;
     @TableField("result")
@@ -28,8 +30,6 @@ public class ThirdPartyInterfaceEntity {
     private String name;
     @TableField("id_card")
     private String idCard;
-    @TableField("type")
-    private String type;
     @TableField("file_id")
     private String fileId;
     @TableField(value = "create_time",fill = FieldFill.INSERT)

+ 0 - 3
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/UserAXQInfoEntity.java

@@ -45,7 +45,4 @@ public class UserAXQInfoEntity implements Serializable {
 
     @TableField("img_seal_id")
     private Integer imgSealId;
-
-    @TableField("compare_img_id")
-    private Integer compareImgId;
 }

+ 2 - 6
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/mapper/ThirdPartyInterfaceMapper.java

@@ -1,12 +1,8 @@
 package me.zhengjie.dao.mybatis.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import me.zhengjie.dao.mybatis.entity.BankEntity;
-import me.zhengjie.dao.mybatis.entity.ThirdPartyInterfaceEntity;
+import me.zhengjie.dao.mybatis.entity.FaceCompareEntity;
 import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
 
 /**
  * <p>
@@ -17,7 +13,7 @@ import java.util.List;
  * @since 2022-03-28
  */
 @Mapper
-public interface ThirdPartyInterfaceMapper extends BaseMapper<ThirdPartyInterfaceEntity> {
+public interface FaceCompareMapper extends BaseMapper<FaceCompareEntity> {
 
 
 }

+ 312 - 117
eladmin-system/src/main/java/me/zhengjie/domain/notary/impl/NotaryDomainImpl.java

@@ -1,5 +1,6 @@
 package me.zhengjie.domain.notary.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.arcsoft.face.*;
 import com.arcsoft.face.enums.DetectMode;
 import com.arcsoft.face.enums.DetectOrient;
@@ -9,29 +10,30 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.base.ResultCode;
-import me.zhengjie.base.file.FaceMinioFileHandle;
-import me.zhengjie.base.file.FileHandleVo;
-import me.zhengjie.base.file.MinioFileHandle;
+import me.zhengjie.base.config.thread.ThreadPoolExecutorUtil;
+import me.zhengjie.base.util.FileUploadUtil;
 import me.zhengjie.base.util.JuheServiceUtil;
+import me.zhengjie.base.util.tencent.utils.HttpClientUtil;
 import me.zhengjie.base.util.tencent.utils.Img2Base64Util;
-import me.zhengjie.dao.mybatis.ThirdPartyInterfaceRepository;
+import me.zhengjie.dao.mybatis.FaceCompareRepository;
 import me.zhengjie.dao.mybatis.entity.*;
 import me.zhengjie.dao.mybatis.mapper.ContractOrderMapper;
 import me.zhengjie.dao.mybatis.mapper.FileInfoMapper;
 import me.zhengjie.dao.mybatis.mapper.SysUserMapper;
-import me.zhengjie.dao.mybatis.mapper.UserAXQInfoMapper;
 import me.zhengjie.domain.img.CompareImageDomain;
 import me.zhengjie.domain.notary.NotaryDomain;
 import me.zhengjie.utils.RedisUtils;
-import me.zhengjie.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.ThreadPoolExecutor;
 
 import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
 
@@ -41,63 +43,70 @@ import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
 public class NotaryDomainImpl implements NotaryDomain {
 
     private final SysUserMapper userMapper;
-    private final UserAXQInfoMapper userAXQInfoMapper;
     private final ContractOrderMapper contractOrderMapper;
-    private final FaceMinioFileHandle minioFileHandle;
     private final FileInfoMapper fileInfoMapper;
     private final RedisUtils redis;
-
-    private final ThirdPartyInterfaceRepository thirdPartyInterfaceRepository;
-
+    private final FaceCompareRepository thirdPartyInterfaceRepository;
     //以下为测试部署环境
-    private static final String APPID = "6F5JVsCCeSEbBSLSXWVwPki71yK5Y4Jf7oUjA4Y3mLtu";
-    private static final String SDKKEY = "5qKM4a9oNSXNhXdwd7Ycrvnxdw2JXjcyeccYmb4zND7S";
-    private static final String LIBPATH = "/home/tom/nt-test/lib/so";
+    @Value("${hongruan.appid}")
+    private  String appid;
+    @Value("${hongruan.sdkkey}")
+    private String sdkkey;
+    @Value("${hongruan.libpath}")
+    private String libpath;
+
 
-    //以下为本地测试
-/*    private static final String APPID = "H6Er8ksqAcKc7Dk4Yum9Rkz4g9Gm77ZXAEMgvenjkTQQ";
-    private static final String SDKKEY = "Abd9D8xZQUqG8vDtU2a1tEkdfThkK1tZppjXzydGwEd6";
-    private static final String LIBPATH = "D:\\arcsoft_lib";*/
 
 
     /**
      * 获取base64取消文件头
+     *
      * @param base64
      * @return
      */
-    public String getBase64(String base64){
+    public String getBase64(String base64) {
         String[] base64s = base64.split("base64");
-        if (base64s!=null && base64s.length>1){
+        if (base64s != null && base64s.length > 1) {
             base64 = base64s[1];
         }
         return base64;
     }
 
 
-
     /**
      * app端的人脸核身
+     *
      * @param compareImageDomain
      * @return
      */
-    public ResultCode appCompareFace(CompareImageDomain compareImageDomain){
+    public ResultCode appCompareFace(CompareImageDomain compareImageDomain) {
         String base64 = compareImageDomain.getBase64();
-        if (base64==null){
+        if (base64 == null) {
             return ResultCode.PARAM_IS_BLANK;
         }
         base64 = getBase64(base64);
         String idCard = compareImageDomain.getIdCard();
         String nickName = compareImageDomain.getName();
-        //当事人的人脸核身
-        QueryWrapper<UserAXQInfoEntity> userAXQInfoEntityQueryWrapper = new QueryWrapper<>();
-        userAXQInfoEntityQueryWrapper.eq("id_card",idCard).eq("nick_name",nickName);
-        UserAXQInfoEntity userAXQInfoEntity = userAXQInfoMapper.selectOne(userAXQInfoEntityQueryWrapper);
-        if (ObjectUtils.isEmpty(userAXQInfoEntity)){
-            return ResultCode.PARAM_IS_INVALID;
+        //根据业务编号获取订单 判断当事人名字
+        String businessNo = compareImageDomain.getBusinessNo();
+        QueryWrapper<ContractOrderEntity> contractOrderEntityQueryWrapper = new QueryWrapper<>();
+        contractOrderEntityQueryWrapper.eq("business_no", businessNo);
+        ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(contractOrderEntityQueryWrapper);
+        Integer id = null;
+        //看是哪个当事人
+        if (nickName.equals(contractOrderEntity.getName())) {
+            id = contractOrderEntity.getCompareImgId();
+        } else if (nickName.equals(contractOrderEntity.getJointName())) {
+            id = contractOrderEntity.getJointCompareImgId();
+        }
+        //后面需要的三个参数 base64 身份证号 姓名
+        String redisCount = "idCard:" + idCard + ":COUNT:";
+        Integer count = null;
+        if (redis.hasKey(redisCount)) {
+            count = (Integer) redis.get(redisCount);
+            System.err.println("redis存入次数" + count);
         }
-        //做过安心签的用户 直接人脸核身 保存图片
 
-        ThirdPartyInterfaceEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64);
         File base = null;
         try {
             base = File.createTempFile("compare", ".jpeg");
@@ -110,21 +119,51 @@ public class NotaryDomainImpl implements NotaryDomain {
             return ResultCode.FACEAUTH_FAIL;
         }
 
-        FileInfoEntity fileInfo = saveCompareImage(base);
-        fileInfoMapper.insert(fileInfo);
-        thirdPartyInterfaceEntity.setFileId(fileInfo.getId()+"");
-        thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo());
-        if (thirdPartyInterfaceEntity.getResult()==1){
-            UserAXQInfoEntity userAxq = new UserAXQInfoEntity();
-            userAxq.setId(userAXQInfoEntity.getId());
-            userAxq.setCompareImgId(fileInfo.getId());
-            userAXQInfoMapper.updateById(userAxq);
-            log.info("当事人人脸核身通过");
+
+        FileInfoEntity fileInfo = uploadFaceFile(base64);
+        boolean redisFlag = (count != null && count >= 2);
+        if (ObjectUtils.isEmpty(id) || redisFlag) {
+            if (! imageCenter(base)){
+                return ResultCode.IMAGE_NOT_STANDARD;
+            }
+            //要做人脸核身
+            FaceCompareEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64);
+            thirdPartyInterfaceEntity.setFileId(fileInfo.getId() + "");
+            thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo());
+            thirdPartyInterfaceEntity.setConsultNo(contractOrderEntity.getConsultNo());
             thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
-            return ResultCode.SUCCESS;
+            if (thirdPartyInterfaceEntity.getResult() == 1) {
+                ContractOrderEntity orderEntity = new ContractOrderEntity();
+                orderEntity.setId(contractOrderEntity.getId());
+                //判断是共同责任人还是当事人
+                if (nickName.equals(contractOrderEntity.getName())) {
+                    orderEntity.setCompareImgId(fileInfo.getId());
+                }
+                if (nickName.equals(contractOrderEntity.getJointName())) {
+                    orderEntity.setJointCompareImgId(fileInfo.getId());
+                }
+                contractOrderMapper.updateById(orderEntity);
+                log.info("当事人人脸核身通过");
+                redis.del(redisCount);
+                return ResultCode.SUCCESS;
+            }
+            return ResultCode.LIVE_VIDEO_INVALID;
         }
-        thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
-        return ResultCode.LIVE_VIDEO_INVALID;
+        //要做照片比对
+        /*if (!compareImage(base, id, redisCount, count)) {
+            return ResultCode.LIVE_VIDEO_INVALID;
+        }*/
+
+        ResultCode resultCode = compareImage(base, id, redisCount, count);
+
+        if (resultCode.code()==100){
+            if (count != null) {
+                redis.del(redisCount);
+            }
+        }
+
+        return resultCode;
+
     }
 
 
@@ -136,23 +175,31 @@ public class NotaryDomainImpl implements NotaryDomain {
      */
     public ResultCode compareFace(CompareImageDomain compareImageDomain) {
         String base64 = compareImageDomain.getBase64();
-        if (base64==null){
+        if (base64 == null) {
             return ResultCode.PARAM_IS_BLANK;
         }
         base64 = getBase64(base64);
         //先判断是银行客户经理还是当事人
         String roleId = compareImageDomain.getRoleId();
         SysUserEntity sysUserEntity = null;
-        UserAXQInfoEntity userAXQInfoEntity = null;
         String idCard = compareImageDomain.getIdCard();
         String nickName = compareImageDomain.getName();
+
+        QueryWrapper<ContractOrderEntity> orderEntityQueryWrapper = new QueryWrapper<>();
+        orderEntityQueryWrapper.eq("business_no", compareImageDomain.getBusinessNo());
+        ContractOrderEntity contractOrder = contractOrderMapper.selectOne(orderEntityQueryWrapper);
+        if (ObjectUtils.isEmpty(contractOrder)) {
+            return ResultCode.PARAM_IS_INVALID;
+        }
+        Integer compareImageId = null;
         boolean flag = "-1".equals(roleId);
         if (flag) {
             //说明是银行客户经理
             QueryWrapper<ContractOrderEntity> contractOrderEntityQueryWrapper = new QueryWrapper<>();
-            contractOrderEntityQueryWrapper.eq("business_no",compareImageDomain.getBusinessNo()).eq("customer_name",compareImageDomain.getName());
+            //通过business_no 和 客户经理姓名 判断是不是当前客户经理
+            contractOrderEntityQueryWrapper.eq("business_no", compareImageDomain.getBusinessNo()).eq("customer_name", compareImageDomain.getName());
             ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(contractOrderEntityQueryWrapper);
-            if (ObjectUtils.isEmpty(contractOrderEntity)){
+            if (ObjectUtils.isEmpty(contractOrderEntity)) {
                 return ResultCode.ACCOUNT_MANAGER_NO_ASSIGNED;
             }
             QueryWrapper<SysUserEntity> sysUserEntityQueryWrapper = new QueryWrapper<>();
@@ -160,13 +207,13 @@ public class NotaryDomainImpl implements NotaryDomain {
             sysUserEntity = userMapper.selectOne(sysUserEntityQueryWrapper);
         } else {
             //说明是当事人
-            QueryWrapper<UserAXQInfoEntity> userAXQInfoEntityQueryWrapper = new QueryWrapper<>();
-            userAXQInfoEntityQueryWrapper.eq("id_card", idCard).eq("user_name", nickName);
-            userAXQInfoEntity = userAXQInfoMapper.selectOne(userAXQInfoEntityQueryWrapper);
-        }
-        if (ObjectUtils.isEmpty(sysUserEntity) && ObjectUtils.isEmpty(userAXQInfoEntity)) {
-            return ResultCode.PARAM_IS_INVALID;
+            if (nickName.equals(contractOrder.getName())) {
+                compareImageId = contractOrder.getCompareImgId();
+            } else if (nickName.equals(contractOrder.getJointName())) {
+                compareImageId = contractOrder.getJointCompareImgId();
+            }
         }
+
         //后面需要的三个参数 base64 身份证号 姓名
         String redisCount = "idCard:" + idCard + ":COUNT:";
         Integer count = null;
@@ -174,8 +221,10 @@ public class NotaryDomainImpl implements NotaryDomain {
             count = (Integer) redis.get(redisCount);
             System.err.println("redis存入次数" + count);
         }
-        //将base64转成图片
-        File base = null;
+        if (compareImageDomain.getBase64()==null){
+            return ResultCode.PARAM_IS_BLANK;
+        }
+       File base = null;
         try {
             base = File.createTempFile("compare", ".jpeg");
             base.deleteOnExit();
@@ -186,18 +235,20 @@ public class NotaryDomainImpl implements NotaryDomain {
             log.info("base64转图片异常");
             return ResultCode.FACEAUTH_FAIL;
         }
-        FileInfoEntity fileInfo = saveCompareImage(base);
-        fileInfoMapper.insert(fileInfo);
-
         boolean redisFlag = (count != null && count >= 2);
         if (flag) {
             //说明是客户经理
             if (sysUserEntity.getCompareImgId() == null || redisFlag) {
+                if (! imageCenter(base)){
+                    return ResultCode.IMAGE_NOT_STANDARD;
+                }
                 //说明客户经理需要做人脸核身
-                ThirdPartyInterfaceEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64);
-                thirdPartyInterfaceEntity.setFileId(fileInfo.getId()+"");
+                FileInfoEntity fileInfo = uploadFaceFile(base64);
+                FaceCompareEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64);
+                thirdPartyInterfaceEntity.setFileId(fileInfo.getId() + "");
+                thirdPartyInterfaceEntity.setConsultNo(contractOrder.getConsultNo());
                 thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo());
-                if (StringUtils.isNotBlank(thirdPartyInterfaceEntity.getMessage())){
+                if (thirdPartyInterfaceEntity.getResult() == 1) {
                     //上传图片到minio FileInfo
                     SysUserEntity bank = new SysUserEntity();
                     bank.setUserId(sysUserEntity.getUserId());
@@ -212,28 +263,36 @@ public class NotaryDomainImpl implements NotaryDomain {
                 thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
                 return ResultCode.LIVE_VIDEO_INVALID;
             }
-        } else {
-            //说明是当事人
-            if (userAXQInfoEntity.getCompareImgId() == null || redisFlag) {
-                //说明当事人需要做人脸核身
-                ThirdPartyInterfaceEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64);
-                thirdPartyInterfaceEntity.setFileId(fileInfo.getId()+"");
-                thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo());
-                if (thirdPartyInterfaceEntity.getResult()==1){
-                    //上传图片到minio FileInfo
-                    UserAXQInfoEntity userAxq = new UserAXQInfoEntity();
-                    userAxq.setId(userAXQInfoEntity.getId());
-                    userAxq.setCompareImgId(fileInfo.getId());
-                    userAXQInfoMapper.updateById(userAxq);
-                    log.info("当事人人脸核身通过");
-                    redis.del(redisCount);
-                    thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
-                    return ResultCode.SUCCESS;
+        } else if (ObjectUtils.isEmpty(compareImageId) || redisFlag) {
+            if (! imageCenter(base)){
+                return ResultCode.IMAGE_NOT_STANDARD;
+            }
+
+            //说明当事人需要做人脸核身
+            FileInfoEntity fileInfo = uploadFaceFile(base64);
+            FaceCompareEntity thirdPartyInterfaceEntity = JuheServiceUtil.URLPost(idCard, nickName, base64);
+            thirdPartyInterfaceEntity.setFileId(fileInfo.getId() + "");
+            thirdPartyInterfaceEntity.setBusinessNo(compareImageDomain.getBusinessNo());
+            thirdPartyInterfaceEntity.setConsultNo(contractOrder.getConsultNo());
+            thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
+            if (thirdPartyInterfaceEntity.getResult() == 1) {
+                //上传图片到minio FileInfo;
+                ContractOrderEntity orderEntity = new ContractOrderEntity();
+                orderEntity.setId(contractOrder.getId());
+                //判断是共同责任人还是当事人
+                if (nickName.equals(contractOrder.getName())) {
+                    orderEntity.setCompareImgId(fileInfo.getId());
                 }
-                log.info("当事人人脸核身失败");
-                thirdPartyInterfaceRepository.insert(thirdPartyInterfaceEntity);
-                return ResultCode.LIVE_VIDEO_INVALID;
+                if (nickName.equals(contractOrder.getJointName())) {
+                    orderEntity.setJointCompareImgId(fileInfo.getId());
+                }
+                redis.del(redisCount);
+                contractOrderMapper.updateById(orderEntity);
+                log.info("当事人人脸核身通过");
+                return ResultCode.SUCCESS;
             }
+            log.info("当事人人脸核身失败");
+            return ResultCode.LIVE_VIDEO_INVALID;
         }
         //如果不用做人脸核身 那么就去做照片比对
         //获取比较图片的id
@@ -241,37 +300,120 @@ public class NotaryDomainImpl implements NotaryDomain {
         if (!ObjectUtils.isEmpty(sysUserEntity)) {
             id = sysUserEntity.getCompareImgId();
         }
-        if (!ObjectUtils.isEmpty(userAXQInfoEntity)) {
-            id = userAXQInfoEntity.getCompareImgId();
+        if (!ObjectUtils.isEmpty(compareImageId)) {
+            id = compareImageId;
         }
-        if (! compareImage(base, id,redisCount,count)) {
+        //要做照片比对
+        /*if (!compareImage(base, id, redisCount, count)) {
             return ResultCode.LIVE_VIDEO_INVALID;
+        }*/
+
+        ResultCode resultCode = compareImage(base, id, redisCount, count);
+
+        if (resultCode.code()==100){
+            if (count != null) {
+                redis.del(redisCount);
+            }
         }
-        if (count != null) {
-            redis.del(redisCount);
+        return resultCode;
+    }
+
+
+    /**
+     * 验证照片是否居中
+     * @param base
+     * @return
+     */
+    public boolean imageCenter(File base) {
+        //从官网获取
+        FaceEngine faceEngine = new FaceEngine(libpath);
+        //激活引擎
+        int errorCode = faceEngine.activeOnline(appid, sdkkey);
+        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+            base.delete();
+            throw new RuntimeException("引擎激活失败");
         }
-        return ResultCode.SUCCESS;
+        ActiveFileInfo activeFileInfo = new ActiveFileInfo();
+        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
+        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+            base.delete();
+            throw new RuntimeException("获取激活文件信息失败");
+        }
+        //引擎配置
+        EngineConfiguration engineConfiguration = new EngineConfiguration();
+        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
+        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
+        engineConfiguration.setDetectFaceMaxNum(10);
+        engineConfiguration.setDetectFaceScaleVal(16);
+        //功能配置
+        FunctionConfiguration functionConfiguration = new FunctionConfiguration();
+        functionConfiguration.setSupportAge(true);
+        functionConfiguration.setSupportFace3dAngle(true);
+        functionConfiguration.setSupportFaceDetect(true);
+        functionConfiguration.setSupportFaceRecognition(true);
+        functionConfiguration.setSupportGender(true);
+        functionConfiguration.setSupportLiveness(true);
+        functionConfiguration.setSupportIRLiveness(true);
+        engineConfiguration.setFunctionConfiguration(functionConfiguration);
+        //初始化引擎
+        errorCode = faceEngine.init(engineConfiguration);
+        if (errorCode != ErrorInfo.MOK.getValue()) {
+            base.delete();
+            throw new RuntimeException("初始化引擎失败");
+        }
+        //人脸检测
+        ImageInfo imageInfo = getRGBData(base);
+        List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
+        errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+        System.out.println(faceInfoList);
+        //人脸属性检测
+        FunctionConfiguration configuration = new FunctionConfiguration();
+        configuration.setSupportFace3dAngle(true);
+        errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);
+        //3D信息检测
+        List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
+        errorCode = faceEngine.getFace3DAngle(face3DAngleList);
+        if (CollectionUtils.isEmpty(face3DAngleList)) {
+            return false;
+        }
+        //俯仰角
+        float pitch = Math.abs(face3DAngleList.get(0).getPitch());
+        //偏向角
+        float yaw = Math.abs(face3DAngleList.get(0).getYaw());
+        log.info("俯仰角:{}", pitch);
+        log.info("偏向角:{}", yaw);
+        if (pitch >= 10 || yaw >= 10) {
+            //照片不符合标准
+            log.info("图片不符合标准");
+            return false;
+        }
+        return true;
     }
 
+
+
     /**
      * 虹软的人脸照片比对
-     * @param base 照片
-     * @param id   文件库中照片的id
+     *
+     * @param base       照片
+     * @param id         文件库中照片的id
      * @param redisCount 数据库中的键
-     * @param count redis当中的次数
+     * @param count      redis当中的次数
      * @return
      */
-    public boolean compareImage(File base, Integer id,String redisCount,Integer count) {
+    public ResultCode compareImage(File base, Integer id, String redisCount, Integer count) {
         //从官网获取
-        FaceEngine faceEngine = new FaceEngine(LIBPATH);
+        FaceEngine faceEngine = new FaceEngine(libpath);
         //激活引擎
-        int errorCode = faceEngine.activeOnline(APPID, SDKKEY);
+        int errorCode = faceEngine.activeOnline(appid, sdkkey);
         if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+            base.delete();
             throw new RuntimeException("引擎激活失败");
         }
         ActiveFileInfo activeFileInfo = new ActiveFileInfo();
         errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
         if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+            base.delete();
             throw new RuntimeException("获取激活文件信息失败");
         }
         //引擎配置
@@ -293,6 +435,7 @@ public class NotaryDomainImpl implements NotaryDomain {
         //初始化引擎
         errorCode = faceEngine.init(engineConfiguration);
         if (errorCode != ErrorInfo.MOK.getValue()) {
+            base.delete();
             throw new RuntimeException("初始化引擎失败");
         }
         //人脸检测
@@ -307,15 +450,47 @@ public class NotaryDomainImpl implements NotaryDomain {
         //3D信息检测
         List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
         errorCode = faceEngine.getFace3DAngle(face3DAngleList);
+        if (CollectionUtils.isEmpty(face3DAngleList)){
+            return ResultCode.IMAGE_NOT_STANDARD;
+        }
         //俯仰角
         float pitch = Math.abs(face3DAngleList.get(0).getPitch());
         //偏向角
         float yaw = Math.abs(face3DAngleList.get(0).getYaw());
-        if (pitch > 10 || yaw > 10) {
+        log.info("俯仰角:{}",pitch);
+        log.info("偏向角:{}",yaw);
+        if (pitch >= 10 || yaw >= 10) {
             //照片不符合标准
             log.info("图片不符合标准");
+            return ResultCode.IMAGE_NOT_STANDARD;
+        }
+        //活体检测
+        /*List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
+        errorCode = faceEngine.getLiveness(livenessInfoList);
+        if (CollectionUtils.isEmpty(livenessInfoList)){
+            log.info("活体验证失败");
+            return false;
+        }
+        System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
+
+        //IR属性处理
+        ImageInfo imageInfoGray = getGrayData(base);
+        List<FaceInfo> faceInfoListGray = new ArrayList<FaceInfo>();
+        errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoListGray);
+
+        FunctionConfiguration configuration2 = new FunctionConfiguration();
+        configuration2.setSupportIRLiveness(true);
+        errorCode = faceEngine.processIr(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration2);
+        //IR活体检测
+        List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
+        errorCode = faceEngine.getLivenessIr(irLivenessInfo);
+        if (CollectionUtils.isEmpty(irLivenessInfo)){
+            log.info("活体验证失败");
             return false;
         }
+        System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());*/
+
+
         //特征提取
         FaceFeature faceFeature = new FaceFeature();
         errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
@@ -326,7 +501,7 @@ public class NotaryDomainImpl implements NotaryDomain {
         String filePath = fileInfoEntity.getPath();
         File file = null;
         try {
-            file = minioFileHandle.getFileWithPath(filePath);
+            file=FileUploadUtil.getFileWithPath(filePath);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -345,33 +520,53 @@ public class NotaryDomainImpl implements NotaryDomain {
         FaceSimilar faceSimilar = new FaceSimilar();
         errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
         //如果通过 上传文件 修改用户绑定id 如果没通过 返回null证明失败了
+        //引擎卸载
+        errorCode = faceEngine.unInit();
         if (faceSimilar.getScore() > 0.8) {
             log.info("人脸照片比对通过");
-            return true;
-        }
-        if (count == null) {
-            redis.set(redisCount, 1, 30, TimeUnit.MINUTES);
-        } else {
-            redis.set(redisCount, count + 1, 30, TimeUnit.MINUTES);
+            base.delete();
+            file.delete();
+            redis.del(redisCount);
+            return ResultCode.SUCCESS;
         }
-        log.info("人脸照片比对未通过");;
-        return false;
+        redis.increment(redisCount);
+        log.info("人脸照片比对未通过");
+        base.delete();
+        file.delete();
+        return ResultCode.LIVE_VIDEO_INVALID;
     }
 
-    private FileInfoEntity saveCompareImage(File base) {
-        FileHandleVo fileHandleVo = new FileHandleVo();
-        fileHandleVo.setFilePath(base.getPath());
-        fileHandleVo.setSourceFilePath("/face/" + base.getName());
-        fileHandleVo.setContentType("image/jpeg");
-        try {
-            minioFileHandle.uploadfilePath(fileHandleVo);
-        } catch (Exception e) {
-            throw new RuntimeException("照片保存到minio异常");
+
+    /**
+     * 上传对比照片到minio
+     * @param base64
+     */
+    public void uploadFile(String base64,String filePath){
+        JSONObject params = new JSONObject();
+        params.put("base64", base64);
+        params.put("filePath",filePath);
+        HttpClientUtil httpClientUtil = new HttpClientUtil();
+        String xmlData = httpClientUtil.doPost("https://fqgz.flowbb.cn:6001/sp/upload/uploadFaceImage",params.toString(),"utf-8");
+        JSONObject result = JSONObject.parseObject(xmlData);
+        String code = result.getString("code");
+        if ("100".equals(code)){
+            log.info("上传成功");
         }
+    }
+    public FileInfoEntity uploadFaceFile(String base64){
+        String s = FileUploadUtil.saveFaceImage(base64);
+        ThreadPoolExecutorUtil.getPoll().execute(new Runnable() {
+            @Override
+            public void run() {
+                uploadFile(base64,s);
+            }
+        });
+        String[] split = s.split("/");
         FileInfoEntity fileInfo = new FileInfoEntity();
-        fileInfo.setLoanNo("face");
-        fileInfo.setFileName(base.getName());
-        fileInfo.setPath(fileInfo.getLoanNo() + "/" + base.getName());
+        fileInfo.setLoanNo(split[0]);
+        fileInfo.setFileName(split[split.length-1]);
+        fileInfo.setPath(s);
+        fileInfoMapper.insert(fileInfo);
         return fileInfo;
     }
 }

+ 5 - 1
eladmin-system/src/main/resources/config/application-nt-test.yml

@@ -219,4 +219,8 @@ axq:
     cfcaURL: https://210.74.42.33:9443/FEP/
     channel: test
     jksPath: anxinsign-test.jks
-    jksPWD: 123456
+    jksPWD: 123456
+hongruan:
+  appid: 6F5JVsCCeSEbBSLSXWVwPki71yK5Y4Jf7oUjA4Y3mLtu
+  sdkkey: 5qKM4a9oNSXNhXdwd7Ycrvnxdw2JXjcyeccYmb4zND7S
+  libpath: /home/tom/nt-test/lib/so

+ 5 - 1
eladmin-system/src/main/resources/config/application-nt.yml

@@ -219,4 +219,8 @@ axq:
     cfcaURL: https://cs.anxinsign.com/FEP/
     channel: prod
     jksPath: anxinqian.jks
-    jksPWD: anxinqian1234
+    jksPWD: anxinqian1234
+hongruan:
+  appid: 6F5JVsCCeSEbBSLSXWVwPki71yK5Y4Jf7oUjA4Y3mLtu
+  sdkkey: 5qKM4a9oNSXNhXdwd7Ycrvnxdw2JXjcyeccYmb4zND7S
+  libpath: /data/fqgz/eladmin/lib/so

+ 1 - 1
eladmin-system/src/main/resources/mapper/ThirdPartyInterfaceMapper.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="me.zhengjie.dao.mybatis.mapper.ThirdPartyInterfaceMapper">
+<mapper namespace="me.zhengjie.dao.mybatis.mapper.FaceCompareMapper">
 
 </mapper>