瀏覽代碼

活体识别

haogh 7 月之前
父節點
當前提交
59f1d9b7bb

+ 6 - 2
src/cn/hmsoft/art/constants/StdResType.java

@@ -21,8 +21,12 @@ public enum StdResType {
 	/*******************
 	 * 小程序视频截图
 	 */
-	VideoAppSnap("VideoAppSnap");
-	
+	VideoAppSnap("VideoAppSnap"),
+	/*******************
+	 * 活体识别
+	 */
+	LIVE("LIVE");
+
 	private String value;
 
 	private StdResType(String value) {

+ 7 - 1
src/cn/hmsoft/art/enrol/control/tencent/LiveRecognitionControl.java

@@ -2,6 +2,7 @@ package cn.hmsoft.art.enrol.control.tencent;
 
 import cn.hmsoft.application.web.AjaxControl;
 import cn.hmsoft.art.constants.Constants;
+import cn.hmsoft.art.data.model.std.StdReg;
 import cn.hmsoft.art.data.response.live.DetectAuthBean;
 import cn.hmsoft.art.data.response.live.DetectInfoResult;
 import cn.hmsoft.art.data.vo.live.DetectAuthVO;
@@ -11,6 +12,7 @@ import cn.hmsoft.art.helper.TencentLiveHelper;
 import cn.hmsoft.art.service.live.LiveRecognitionService;
 import cn.hmsoft.frame.exception.BusinessException;
 import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.CollectionHelper;
 import cn.hmsoft.helper.StringHelper;
 import com.tencentcloudapi.faceid.v20180301.models.DetectAuthResponse;
 import org.slf4j.Logger;
@@ -42,6 +44,10 @@ public class LiveRecognitionControl extends AjaxControl {
         //设置业务ID和调整地址
         detectAuthVO.setRuleId(ArtParamHelper.TencentLiveRuleId);
         detectAuthVO.setRedirectUrl(ArtParamHelper.TencentLiveRedirectUrl);
+
+        // 考生是否存在
+        StdReg stdReg = liveRecognitionService.findStdRegByCertAndName(detectAuthVO);
+
         //请求腾讯detectAuth接口
         DetectAuthResponse response = TencentLiveHelper.detectAuth(detectAuthVO);
         DetectAuthBean bean = new DetectAuthBean();
@@ -51,7 +57,7 @@ public class LiveRecognitionControl extends AjaxControl {
             bean.setRequestId(response.getRequestId());
         }
         //将token信息保存
-        liveRecognitionService.saveDetectAuth(bean, detectAuthVO);
+        liveRecognitionService.saveDetectAuth(stdReg, bean, detectAuthVO);
         return bean;
     }
 

+ 58 - 10
src/cn/hmsoft/art/service/live/LiveRecognitionService.java

@@ -10,8 +10,10 @@ import cn.hmsoft.art.data.model.live.TxStdLiveLog;
 import cn.hmsoft.art.data.model.live.txStdMaterialLog;
 import cn.hmsoft.art.data.model.std.StdMaterial;
 import cn.hmsoft.art.data.model.std.StdReg;
+import cn.hmsoft.art.data.model.std.StdRes;
 import cn.hmsoft.art.data.response.live.*;
 import cn.hmsoft.art.data.vo.live.DetectAuthVO;
+import cn.hmsoft.art.enrol.data.dao.std.EnrolStdResDao;
 import cn.hmsoft.art.enrol.helper.EnrolMaterialHelper;
 import cn.hmsoft.art.helper.ArtParamHelper;
 import cn.hmsoft.art.helper.GsonHelper;
@@ -29,6 +31,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.File;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -50,6 +53,10 @@ public class LiveRecognitionService extends ArtService {
     @Autowired
     private StdMaterialDao stdMaterialDao;
 
+    @Autowired
+    private EnrolStdResDao stdResDao;
+
+
     @Transactional
     public DetectInfoResult saveDetectResult(String bizToken, String result) {
         log.info("[saveDetectResult] bizToken:{},result:{}", bizToken, result);
@@ -110,10 +117,14 @@ public class LiveRecognitionService extends ArtService {
             }
 
             // 保存考生照片
+            StdReg reg = stdRegDao.findByStdId(txStdLiveLog.getStd_id());
+            if (reg == null) {
+                log.error("[saveDetectResult] std_id:{} 找不到考生", txStdLiveLog.getStd_id());
+                throw new BusinessException(Constants.SYSTEM_BUSY);
+            }
             try {
                 DetectInfoBestFrame bestFrame = detectInfoBean.getBestFrame();
                 if (bestFrame != null && StringHelper.isNotEmpty(bestFrame.getBestFrame())) {
-                    StdReg reg = stdRegDao.findByStdId(txStdLiveLog.getStd_id());
                     String rootPath = EnrolMaterialHelper.getEnrolMaterialLocalPath();
                     // 文件名称
                     String fileName = EnrolMaterialHelper.generateMaterialName(StdMaterialType.NoCrownPhoto, reg.getCert_id()) + Constants.PHOTO_SUFFIX;
@@ -161,10 +172,11 @@ public class LiveRecognitionService extends ArtService {
 
                         //更新考生表中的头像和状态
                         reg.setStd_image(fileName);
-                        reg.setReg_status(StdRegStatus.NoCrownPhoto);
+                        // 识别通过
                         if (detectInfoResult.getResult().equals("1")) {
+                            reg.setReg_status(StdRegStatus.NoCrownPhoto);
                             reg.setStd_verify_flag(FrameStatus.Active.toString());
-                        } else {
+                        } else { // 识别不通过
                             reg.setStd_verify_flag(FrameStatus.InActive.toString());
                         }
                         stdRegDao.update(reg);
@@ -175,19 +187,38 @@ public class LiveRecognitionService extends ArtService {
                 log.warn("[saveDetectResult] 保存图片失败,{}", e.getMessage());
             }
 
+            //保存日志
+            StdRes res = stdResDao.findRes(txStdLiveLog.getStd_id(), StdResType.LIVE.toString());
+            // 第一次请求,写入
+            if (res == null) {
+                StdRes stdRes = new StdRes();
+                stdRes.setWeixin_id(reg.getWeixin_id());
+                stdRes.setStd_id(txStdLiveLog.getStd_id());
+                stdRes.setRes_type(StdResType.LIVE.toString());
+                stdRes.setRes_date(LocalDate.now());
+                stdRes.setRes_number(1);
+                stdResDao.insert(stdRes);
+            }
+            // 更新日期
+            if(res != null && (res.getRes_date() == null || !res.getRes_date().equals(LocalDate.now()))) {
+                res.setRes_date(LocalDate.now());
+                res.setRes_number(1);
+                stdResDao.update(res);
+            }
+            // 请求次数+1
+            if (res != null && res.getRes_date() != null && res.getRes_date().equals(LocalDate.now())) {
+                res.setRes_date(LocalDate.now());
+                res.setRes_number(res.getRes_number() + 1);
+                stdResDao.update(res);
+            }
+
             //保存视频数据(暂不保存)
         }
 
         return detectInfoResult;
     }
 
-    public void saveDetectAuth(DetectAuthBean bean, DetectAuthVO detectAuthVO) {
-        StdReg stdReg = stdRegDao.findStdRegByCertAndName(detectAuthVO.getCertId(), detectAuthVO.getStdName());
-        if (stdReg == null) {
-            log.warn("[saveDetectAuth] 考生信息不存在,std_name:{}, cert_id:{}", detectAuthVO.getStdName(), detectAuthVO.getCertId());
-            throw new BusinessException("考生信息不存在");
-        }
-
+    public void saveDetectAuth(StdReg stdReg, DetectAuthBean bean, DetectAuthVO detectAuthVO) {
         //保存token
         TxStdLiveLog log = new TxStdLiveLog();
         log.setBiz_token(bean.getBizToken());
@@ -196,4 +227,21 @@ public class LiveRecognitionService extends ArtService {
         log.setPull_flag(Constants.FALSE_FLAG);
         txStdLiveLogDao.insert(log);
     }
+
+    public StdReg findStdRegByCertAndName(DetectAuthVO detectAuthVO) {
+        StdReg stdReg = stdRegDao.findStdRegByCertAndName(detectAuthVO.getCertId(), detectAuthVO.getStdName());
+        if (stdReg == null) {
+            log.warn("[findStdRegByCertAndName] 考生信息不存在,std_name:{}, cert_id:{}", detectAuthVO.getStdName(), detectAuthVO.getCertId());
+            throw new BusinessException("考生信息不存在");
+        }
+        // 当天活体识别最大次数
+        String max = CollectionHelper.getParamValue(ArtParamHelper.GobalParamMap, "EnrolNoCrownPhotoNumber", "3");
+        StdRes res = stdResDao.findRes(stdReg.getStd_id(), StdResType.LIVE.toString());
+        if (res != null && res.getRes_number() != null && res.getRes_date() != null && res.getRes_date().isEqual(LocalDate.now())
+                && res.getRes_number() >= Integer.parseInt(max)) {
+            log.warn("[findStdRegByCertAndName] 活体识别次数超限,std_id: {}", stdReg.getStd_id());
+            throw new BusinessException("该微信号本日使用活体识别次数超限,请明日再试!");
+        }
+        return stdReg;
+    }
 }