Browse Source

人脸识别新增审核身份信息功能

hyq 5 years ago
parent
commit
bbced63e1d

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/controller/SysOssController.java

@@ -142,8 +142,8 @@ public class SysOssController {
         }
         }
         Long size = file.getSize();
         Long size = file.getSize();
         int ImgFileSize=Math.round(size/1024*100)/100;//取得图片文件的大小
         int ImgFileSize=Math.round(size/1024*100)/100;//取得图片文件的大小
-        if(ImgFileSize > 350){
-            throw new RRException("上传视频,不能超过 350k");
+        if(ImgFileSize > 500){
+            throw new RRException("上传视频,不能超过 500k");
         }
         }
 
 
         BASE64Encoder base64Encoder =new BASE64Encoder();
         BASE64Encoder base64Encoder =new BASE64Encoder();

+ 31 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/faceid/CheckFaceLivenessRecogController.java

@@ -2,6 +2,7 @@ package com.kmall.admin.controller.faceid;
 
 
 import com.kmall.admin.dto.FaceByOrderDto;
 import com.kmall.admin.dto.FaceByOrderDto;
 import com.kmall.admin.dto.OrderRecognitionDto;
 import com.kmall.admin.dto.OrderRecognitionDto;
+import com.kmall.admin.entity.FaceLivenessRecognitionReturnDataEntity;
 import com.kmall.admin.entity.OrderEntity;
 import com.kmall.admin.entity.OrderEntity;
 import com.kmall.admin.service.OrderService;
 import com.kmall.admin.service.OrderService;
 import com.kmall.admin.service.faceid.FaceIdService;
 import com.kmall.admin.service.faceid.FaceIdService;
@@ -30,6 +31,11 @@ public class CheckFaceLivenessRecogController {
     @Autowired
     @Autowired
     private OrderService orderService;
     private OrderService orderService;
 
 
+    /**
+     * 人脸识别
+     * @param faceByOrderDto
+     * @return
+     */
     @RequestMapping("face/checkLivenessRecognition")
     @RequestMapping("face/checkLivenessRecognition")
     @RequiresPermissions("face:checkLivenessRecognition")
     @RequiresPermissions("face:checkLivenessRecognition")
     public R checkLivenessRecognition(@RequestBody FaceByOrderDto faceByOrderDto) {
     public R checkLivenessRecognition(@RequestBody FaceByOrderDto faceByOrderDto) {
@@ -55,10 +61,35 @@ public class CheckFaceLivenessRecogController {
         return R.ok().put("page", pageUtil);
         return R.ok().put("page", pageUtil);
     }
     }
 
 
+    /**
+     * 发送模板
+     * @param orderId
+     * @return
+     */
     @RequestMapping("face/sendWxTemp/{orderId}")
     @RequestMapping("face/sendWxTemp/{orderId}")
 //    @RequiresPermissions("face:sendWxTemp")
 //    @RequiresPermissions("face:sendWxTemp")
     public R sendWxTemp(@PathVariable("orderId") long orderId) {
     public R sendWxTemp(@PathVariable("orderId") long orderId) {
         faceIdService.sendWxTemp(orderId);
         faceIdService.sendWxTemp(orderId);
         return R.ok();
         return R.ok();
     }
     }
+
+
+    /**
+     * 手动操作人脸核验成功
+     * @param orderId
+     * @return
+     */
+    @RequestMapping("face/manualCheckFace/{orderId}")
+//    @RequiresPermissions("face:sendWxTemp")
+    public R manualCheckFace(@PathVariable("orderId") long orderId) {
+        faceIdService.manualCheckFace(orderId);
+        return R.ok();
+    }
+
+    @RequestMapping("face/get/{faceLivenessId}")
+//    @RequiresPermissions("face:sendWxTemp")
+    public R get(@PathVariable("faceLivenessId") long faceLivenessId) {
+        FaceLivenessRecognitionReturnDataEntity entity = faceIdService.get(faceLivenessId);
+        return R.ok().put("faceLiveness",entity);
+    }
 }
 }

+ 34 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/OrderRecognitionDto.java

@@ -211,6 +211,24 @@ public class OrderRecognitionDto implements Serializable {
 
 
   private String thirdIsFaceCheck;
   private String thirdIsFaceCheck;
 
 
+  //人脸核验失败次数
+  private Integer failCount;
+
+  /**
+   * 人脸核验id
+   */
+  private Integer faceLivenessId;
+
+  private String checkOperatorType;
+
+  public String getCheckOperatorType() {
+    return checkOperatorType;
+  }
+
+  public void setCheckOperatorType(String checkOperatorType) {
+    this.checkOperatorType = checkOperatorType;
+  }
+
   public String getThirdIsFaceCheck() {
   public String getThirdIsFaceCheck() {
     return thirdIsFaceCheck;
     return thirdIsFaceCheck;
   }
   }
@@ -1123,4 +1141,20 @@ public class OrderRecognitionDto implements Serializable {
   public void setLastFaceTime(String lastFaceTime) {
   public void setLastFaceTime(String lastFaceTime) {
     this.lastFaceTime = lastFaceTime;
     this.lastFaceTime = lastFaceTime;
   }
   }
+
+  public Integer getFailCount() {
+    return failCount;
+  }
+
+  public void setFailCount(Integer failCount) {
+    this.failCount = failCount;
+  }
+
+  public Integer getFaceLivenessId() {
+    return faceLivenessId;
+  }
+
+  public void setFaceLivenessId(Integer faceLivenessId) {
+    this.faceLivenessId = faceLivenessId;
+  }
 }
 }

+ 51 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/FaceLivenessRecognitionReturnDataEntity.java

@@ -62,6 +62,25 @@ public class FaceLivenessRecognitionReturnDataEntity implements Serializable {
      * 时间戳
      * 时间戳
      */
      */
     private Date tstm;
     private Date tstm;
+    /**
+     * 核验失败次数
+     */
+    private Integer failCount;
+
+    /**
+     * 核验操作类型 1:人脸活体识别,2:按钮审核身份
+     */
+    private String checkOperatorType;
+
+    /**
+     * 人脸失败,审核会员身份操作人
+     */
+    private String checkOperatorSn;
+
+    /**
+     * 审核操作时间
+     */
+    private Date checkOperatorTime;
 
 
     /**
     /**
      * 设置:主键
      * 设置:主键
@@ -224,4 +243,36 @@ public class FaceLivenessRecognitionReturnDataEntity implements Serializable {
     public Date getTstm() {
     public Date getTstm() {
         return tstm;
         return tstm;
     }
     }
+
+    public Integer getFailCount() {
+        return failCount;
+    }
+
+    public void setFailCount(Integer failCount) {
+        this.failCount = failCount;
+    }
+
+    public String getCheckOperatorType() {
+        return checkOperatorType;
+    }
+
+    public void setCheckOperatorType(String checkOperatorType) {
+        this.checkOperatorType = checkOperatorType;
+    }
+
+    public String getCheckOperatorSn() {
+        return checkOperatorSn;
+    }
+
+    public void setCheckOperatorSn(String checkOperatorSn) {
+        this.checkOperatorSn = checkOperatorSn;
+    }
+
+    public Date getCheckOperatorTime() {
+        return checkOperatorTime;
+    }
+
+    public void setCheckOperatorTime(Date checkOperatorTime) {
+        this.checkOperatorTime = checkOperatorTime;
+    }
 }
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/faceid/FaceIdService.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.service.faceid;
 package com.kmall.admin.service.faceid;
 
 
 import com.kmall.admin.dto.FaceByOrderDto;
 import com.kmall.admin.dto.FaceByOrderDto;
+import com.kmall.admin.entity.FaceLivenessRecognitionReturnDataEntity;
 
 
 /**
 /**
  * @author huangyq
  * @author huangyq
@@ -11,4 +12,8 @@ public interface FaceIdService {
     String checkLivenessRecognition(FaceByOrderDto faceByOrderDto);
     String checkLivenessRecognition(FaceByOrderDto faceByOrderDto);
 
 
     String sendWxTemp(long orderId);
     String sendWxTemp(long orderId);
+
+    String manualCheckFace(long orderId);
+
+    FaceLivenessRecognitionReturnDataEntity get(long id);
 }
 }

+ 36 - 3
kmall-admin/src/main/java/com/kmall/admin/service/impl/faceid/FaceIdServiceImpl.java

@@ -6,8 +6,10 @@ import com.kmall.admin.dto.FaceByOrderDto;
 import com.kmall.admin.dto.SendTempDto;
 import com.kmall.admin.dto.SendTempDto;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.dao.SysConfigDao;
 import com.kmall.admin.fromcomm.dao.SysConfigDao;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.service.UserService;
 import com.kmall.admin.service.UserService;
 import com.kmall.admin.service.faceid.FaceIdService;
 import com.kmall.admin.service.faceid.FaceIdService;
+import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.manager.dao.TemplateConfDao;
 import com.kmall.manager.dao.TemplateConfDao;
 import com.kmall.manager.dto.FaceIdRequestDto;
 import com.kmall.manager.dto.FaceIdRequestDto;
 import com.kmall.common.constant.Dict;
 import com.kmall.common.constant.Dict;
@@ -102,7 +104,8 @@ public class FaceIdServiceImpl implements FaceIdService {
         if(!responseData.getCode().equalsIgnoreCase("0")){
         if(!responseData.getCode().equalsIgnoreCase("0")){
             //更新验证活体人脸核身接口返回的数据记录表中的是否验证成功为已验证,通知模板为未通知
             //更新验证活体人脸核身接口返回的数据记录表中的是否验证成功为已验证,通知模板为未通知
             if(returnDataEntity != null) {
             if(returnDataEntity != null) {
-                updateFaceLivenessRecognition(orderEntity.getOrderSn(), "0", responseData.getMsg());
+                int failCount = returnDataEntity.getFailCount()==null?0:returnDataEntity.getFailCount();
+                updateFaceLivenessRecognition(orderEntity.getOrderSn(), "0", failCount, responseData.getMsg());
             }
             }
             throw new RRException(responseData.getMsg());
             throw new RRException(responseData.getMsg());
         }else{//人脸核验成功
         }else{//人脸核验成功
@@ -116,7 +119,7 @@ public class FaceIdServiceImpl implements FaceIdService {
             userDao.update(user);
             userDao.update(user);
             //更新验证活体人脸核身接口返回的数据记录表中的是否验证成功为已验证,通知模板为未通知
             //更新验证活体人脸核身接口返回的数据记录表中的是否验证成功为已验证,通知模板为未通知
             if(returnDataEntity != null) {
             if(returnDataEntity != null) {
-                updateFaceLivenessRecognition(orderEntity.getOrderSn(), "1", responseData.getMsg());
+                updateFaceLivenessRecognition(orderEntity.getOrderSn(), "1", null, responseData.getMsg());
             }
             }
             return responseData.getMsg();
             return responseData.getMsg();
         }
         }
@@ -202,12 +205,42 @@ public class FaceIdServiceImpl implements FaceIdService {
      * @param isFaceCheck
      * @param isFaceCheck
      * @param msg
      * @param msg
      */
      */
-    private void updateFaceLivenessRecognition(String orderSn,String isFaceCheck,String msg){
+    private void updateFaceLivenessRecognition(String orderSn,String isFaceCheck, Integer failCount, String msg){
         FaceLivenessRecognitionReturnDataEntity entity = new FaceLivenessRecognitionReturnDataEntity();
         FaceLivenessRecognitionReturnDataEntity entity = new FaceLivenessRecognitionReturnDataEntity();
         entity.setOrderSn(orderSn);
         entity.setOrderSn(orderSn);
         entity.setIsFaceCheck(isFaceCheck);
         entity.setIsFaceCheck(isFaceCheck);
         entity.setIsTempNoti("0");//未通知
         entity.setIsTempNoti("0");//未通知
         entity.setRecognitionReturnMsg(msg);
         entity.setRecognitionReturnMsg(msg);
+        if(failCount != null) {
+            entity.setFailCount(failCount + 1);
+        }
+        entity.setCheckOperatorType(Dict.checkOperatorType.item_1.getItem());
         faceLivenessRecognitionReturnDataDao.updateByMerchOrderSn(entity);
         faceLivenessRecognitionReturnDataDao.updateByMerchOrderSn(entity);
     }
     }
+
+    public String manualCheckFace(long orderId){
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        OrderEntity orderEntity = orderDao.queryObject(orderId);
+        if(orderEntity != null) {
+            FaceLivenessRecognitionReturnDataEntity faceLivenessRecognitionReturnDataEntity = faceLivenessRecognitionReturnDataDao.getFaceByOrderSn(orderEntity.getOrderSn());
+            if(faceLivenessRecognitionReturnDataEntity != null) {
+                FaceLivenessRecognitionReturnDataEntity entity = new FaceLivenessRecognitionReturnDataEntity();
+                entity.setId(faceLivenessRecognitionReturnDataEntity.getId());
+                entity.setCheckOperatorType(Dict.checkOperatorType.item_2.getItem());
+                entity.setCheckOperatorSn(user.getUsername());
+                entity.setCheckOperatorTime(new Date());
+                entity.setIsFaceCheck("1");
+                faceLivenessRecognitionReturnDataDao.update(entity);
+            }else{
+                return "审核失败!订单人脸识别数据不存在";
+            }
+        }else{
+            return "审核失败!订单不存在";
+        }
+        return "审核成功";
+    }
+
+    public FaceLivenessRecognitionReturnDataEntity get(long id){
+        return faceLivenessRecognitionReturnDataDao.queryObject(id);
+    }
 }
 }

+ 41 - 41
kmall-admin/src/main/resources/conf/fastdfs.properties

@@ -1,7 +1,43 @@
-##\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
-connect_timeout=30
+###\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
+#connect_timeout=30
+#
+##\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
+#network_timeout=60
+#
+##\u6587\u4EF6\u8DEF\u5F84
+#base_path=/data/files/
+#
+##tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
+##Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
+#tracker_server=192.168.1.251:22122
+#
+#log_level=info
+#
+#use_connection_pool = false
+#
+#connection_pool_max_idle_time = 3600
+#
+#load_fdfs_parameters_from_tracker=false
+#
+#use_storage_id = false
+#
+#storage_ids_filename = storage_ids.conf
+#
+##HTTP \u670D\u52A1\u5668\u5730\u5740
+#http.tracket_nginx_addr=192.168.1.251
+#
+##HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
+#http.tracker_server_port=80
+#
+##\u6587\u4EF6\u4F5C\u8005
+#file.author=kmall-pt
+
 
 
-#\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
+#############\u751F\u4EA7\u73AF\u5883################
+##\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
+#connect_timeout=30
+#
+##\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
 network_timeout=60
 network_timeout=60
 
 
 #\u6587\u4EF6\u8DEF\u5F84
 #\u6587\u4EF6\u8DEF\u5F84
@@ -9,7 +45,7 @@ base_path=/data/files/
 
 
 #tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
 #tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
 #Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
 #Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-tracker_server=192.168.1.251:22122
+tracker_server=120.76.26.84:22122
 
 
 log_level=info
 log_level=info
 
 
@@ -24,46 +60,10 @@ use_storage_id = false
 storage_ids_filename = storage_ids.conf
 storage_ids_filename = storage_ids.conf
 
 
 #HTTP \u670D\u52A1\u5668\u5730\u5740
 #HTTP \u670D\u52A1\u5668\u5730\u5740
-http.tracket_nginx_addr=192.168.1.251
+http.tracket_nginx_addr=120.76.26.84
 
 
 #HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
 #HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
 http.tracker_server_port=80
 http.tracker_server_port=80
 
 
 #\u6587\u4EF6\u4F5C\u8005
 #\u6587\u4EF6\u4F5C\u8005
 file.author=kmall-pt
 file.author=kmall-pt
-
-
-###############\u751F\u4EA7\u73AF\u5883################
-####\u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4
-###connect_timeout=30
-###
-####\u7F51\u7EDC\u8D85\u65F6\u65F6\u95F4
-##network_timeout=60
-##
-###\u6587\u4EF6\u8DEF\u5F84
-##base_path=/data/files/
-##
-###tracker server\u662FFastDFS\u6587\u4EF6\u7CFB\u7EDF\u7684\u534F\u8C03\u8005,\u5176\u4E3B\u8981\u4F5C\u7528\u662F\u8D1F\u8F7D\u5747\u8861\u548C\u8C03\u5EA6\u3002
-###Tracker server\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5206\u7EC4\u548CStorage server\u7684\u72B6\u6001\u7B49\u4FE1\u606F\uFF0C\u4E0D\u8BB0\u5F55\u6587\u4EF6\u7D22\u5F15\u4FE1\u606F
-##tracker_server=120.76.26.84:22122
-##
-##log_level=info
-##
-##use_connection_pool = false
-##
-##connection_pool_max_idle_time = 3600
-##
-##load_fdfs_parameters_from_tracker=false
-##
-##use_storage_id = false
-##
-##storage_ids_filename = storage_ids.conf
-##
-###HTTP \u670D\u52A1\u5668\u5730\u5740
-##http.tracket_nginx_addr=120.76.26.84
-##
-###HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
-##http.tracker_server_port=80
-##
-###\u6587\u4EF6\u4F5C\u8005
-##file.author=kmall-pt

+ 1 - 1
kmall-admin/src/main/resources/logback.xml

@@ -225,4 +225,4 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
         <appender-ref ref="warnAppender" />
         <appender-ref ref="warnAppender" />
         <appender-ref ref="errorAppender" />-->
         <appender-ref ref="errorAppender" />-->
     </root>
     </root>
-</configuration>
+</configuration>

+ 31 - 1
kmall-admin/src/main/resources/mybatis/mapper/FaceLivenessRecognitionReturnDataDao.xml

@@ -11,6 +11,10 @@
         <result property="userId" column="user_id"/>
         <result property="userId" column="user_id"/>
         <result property="tempNotiMsg" column="temp_noti_msg"/>
         <result property="tempNotiMsg" column="temp_noti_msg"/>
 		<result property="recognitionReturnMsg" column="recognition_return_msg"/>
 		<result property="recognitionReturnMsg" column="recognition_return_msg"/>
+		<result property="failCount" column="fail_count"/>
+		<result property="checkOperatorType" column="check_operator_type"/>
+		<result property="checkOperatorSn" column="check_operator_sn"/>
+		<result property="checkOperatorTime" column="check_operator_time"/>
         <result property="createrSn" column="creater_sn"/>
         <result property="createrSn" column="creater_sn"/>
         <result property="createTime" column="create_time"/>
         <result property="createTime" column="create_time"/>
         <result property="moderSn" column="moder_sn"/>
         <result property="moderSn" column="moder_sn"/>
@@ -28,6 +32,10 @@
 			`user_id`,
 			`user_id`,
 			`temp_noti_msg`,
 			`temp_noti_msg`,
 			recognition_return_msg,
 			recognition_return_msg,
+			fail_count,
+			check_operator_type,
+			check_operator_sn,
+			check_operator_time,
 			`creater_sn`,
 			`creater_sn`,
 			`create_time`,
 			`create_time`,
 			`moder_sn`,
 			`moder_sn`,
@@ -46,7 +54,11 @@
     		`is_face_check`,
     		`is_face_check`,
     		`user_id`,
     		`user_id`,
     		`temp_noti_msg`,
     		`temp_noti_msg`,
-		recognition_return_msg,
+			recognition_return_msg,
+			fail_count,
+			check_operator_type,
+			check_operator_sn,
+			check_operator_time,
     		`creater_sn`,
     		`creater_sn`,
     		`create_time`,
     		`create_time`,
     		`moder_sn`,
     		`moder_sn`,
@@ -87,6 +99,10 @@
 			`user_id`,
 			`user_id`,
 			`temp_noti_msg`,
 			`temp_noti_msg`,
 			recognition_return_msg,
 			recognition_return_msg,
+			fail_count,
+			check_operator_type,
+			check_operator_sn,
+			check_operator_time,
 			`creater_sn`,
 			`creater_sn`,
 			`create_time`,
 			`create_time`,
 			`moder_sn`,
 			`moder_sn`,
@@ -100,6 +116,10 @@
 			#{userId},
 			#{userId},
 			#{tempNotiMsg},
 			#{tempNotiMsg},
 			#{recognitionReturnMsg},
 			#{recognitionReturnMsg},
+			#{failCount},
+			#{checkOperatorType},
+			#{checkOperatorSn},
+			#{checkOperatorTime},
 			#{createrSn},
 			#{createrSn},
 			#{createTime},
 			#{createTime},
 			#{moderSn},
 			#{moderSn},
@@ -117,6 +137,10 @@
 			<if test="userId != null">`user_id` = #{userId}, </if>
 			<if test="userId != null">`user_id` = #{userId}, </if>
 			<if test="tempNotiMsg != null">`temp_noti_msg` = #{tempNotiMsg}, </if>
 			<if test="tempNotiMsg != null">`temp_noti_msg` = #{tempNotiMsg}, </if>
 			<if test="recognitionReturnMsg != null">`recognition_return_msg` = #{recognitionReturnMsg}, </if>
 			<if test="recognitionReturnMsg != null">`recognition_return_msg` = #{recognitionReturnMsg}, </if>
+			<if test="failCount != null">`fail_count` = #{failCount}, </if>
+			<if test="checkOperatorType != null">`check_operator_type` = #{checkOperatorType}, </if>
+			<if test="checkOperatorSn != null">`check_operator_sn` = #{checkOperatorSn}, </if>
+			<if test="checkOperatorTime != null">`check_operator_time` = #{checkOperatorTime}, </if>
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
@@ -144,6 +168,8 @@
 			<if test="isFaceCheck != null">`is_face_check` = #{isFaceCheck}, </if>
 			<if test="isFaceCheck != null">`is_face_check` = #{isFaceCheck}, </if>
 			<if test="userId != null">`user_id` = #{userId}, </if>
 			<if test="userId != null">`user_id` = #{userId}, </if>
 			<if test="recognitionReturnMsg != null">`recognition_return_msg` = #{recognitionReturnMsg}, </if>
 			<if test="recognitionReturnMsg != null">`recognition_return_msg` = #{recognitionReturnMsg}, </if>
+			<if test="failCount != null">`fail_count` = #{failCount}, </if>
+			<if test="checkOperatorType != null">`check_operator_type` = #{checkOperatorType}, </if>
 		</set>
 		</set>
 		where order_sn = #{orderSn}
 		where order_sn = #{orderSn}
 	</update>
 	</update>
@@ -171,6 +197,10 @@
 			`user_id`,
 			`user_id`,
 			`temp_noti_msg`,
 			`temp_noti_msg`,
 			recognition_return_msg,
 			recognition_return_msg,
+			fail_count,
+			check_operator_type,
+			check_operator_sn,
+			check_operator_time,
 			`creater_sn`,
 			`creater_sn`,
 			`create_time`,
 			`create_time`,
 			`moder_sn`,
 			`moder_sn`,

+ 6 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -1180,6 +1180,9 @@
         <result property="tempNotiMsg" column="temp_noti_msg"/>
         <result property="tempNotiMsg" column="temp_noti_msg"/>
         <result property="recognitionReturnMsg" column="recognition_return_msg"/>
         <result property="recognitionReturnMsg" column="recognition_return_msg"/>
         <result property="lastFaceTime" column="last_face_time"/>
         <result property="lastFaceTime" column="last_face_time"/>
+        <result property="failCount" column="fail_count"/>
+        <result property="checkOperatorType" column="check_operator_type"/>
+        <result property="faceLivenessId" column="faceLivenessId"/>
     </resultMap>
     </resultMap>
 
 
     <select id="queryOrderListByRecognition" resultMap="orderRecognitionMap">
     <select id="queryOrderListByRecognition" resultMap="orderRecognitionMap">
@@ -1220,6 +1223,9 @@
         fd.is_face_check,
         fd.is_face_check,
         fd.temp_noti_msg,
         fd.temp_noti_msg,
         fd.recognition_return_msg,
         fd.recognition_return_msg,
+        fd.fail_count,
+        fd.id 'faceLivenessId',
+        fd.check_operator_type,
         u.last_face_time,
         u.last_face_time,
         t.is_face_check 'thirdIsFaceCheck'
         t.is_face_check 'thirdIsFaceCheck'
         FROM
         FROM

+ 16 - 0
kmall-admin/src/main/webapp/WEB-INF/page/faceid/type10ordernopay.html

@@ -56,6 +56,22 @@
             <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
             <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
         </i-form>
         </i-form>
     </Card>
     </Card>
+
+    <Card v-show="showList == 3">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="checkFaceOperator" :rules="ruleValidate" :label-width="120">
+            <Form-item label="核验操作类型" prop="idCard">
+                {{checkFaceOperator.checkOperatorType==1?'人脸活体识别':'按钮审核身份'}}
+            </Form-item>
+            <Form-item label="审核会员身份操作人" prop="checkOperatorSn">
+                {{checkFaceOperator.checkOperatorSn}}
+            </Form-item>
+            <Form-item label="审核操作时间" prop="checkOperatorTime">
+                {{checkFaceOperator.checkOperatorTime}}
+            </Form-item>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+        </i-form>
+    </Card>
 </div>
 </div>
 <script src="https://cdn.webrtc-experiment.com/MediaStreamRecorder.js"> </script>
 <script src="https://cdn.webrtc-experiment.com/MediaStreamRecorder.js"> </script>
 <script src="${rc.contextPath}/js/faceid/type10ordernopay.js?_${date.systemTime}"></script>
 <script src="${rc.contextPath}/js/faceid/type10ordernopay.js?_${date.systemTime}"></script>

+ 66 - 10
kmall-admin/src/main/webapp/js/faceid/type10ordernopay.js

@@ -22,11 +22,11 @@ $(function () {
         colModel: [
         colModel: [
             {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
             {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
             {label: '所属门店', name: 'storeName', index: 'storeName',align: 'center', width: 70},
             {label: '所属门店', name: 'storeName', index: 'storeName',align: 'center', width: 70},
-            {label: '订单号', name: 'orderSn', index: 'order_sn', align: 'center',width: 110},
-            {label: '会员', name: 'userName', index: 'user_name', align: 'center',width: 60},
-            {label: '商户订单号', name: 'merchOrderSn', index: 'merchOrderSn',align: 'center', width: 110},
+            {label: '订单号', name: 'orderSn', index: 'order_sn', align: 'center',width: 100},
+            {label: '会员', name: 'userName', index: 'user_name', align: 'center',width: 50},
+            // {label: '商户订单号', name: 'merchOrderSn', index: 'merchOrderSn',align: 'center', width: 80},
             {
             {
-                label: '订单业务类型', name: 'orderBizType', index: 'order_biz_type',align: 'center', width: 70,
+                label: '订单业务类型', name: 'orderBizType', index: 'order_biz_type',align: 'center', width: 60,
                 formatter: function (value) {
                 formatter: function (value) {
                     if (value == '00') {
                     if (value == '00') {
                         return '保税备货';
                         return '保税备货';
@@ -41,7 +41,7 @@ $(function () {
                 }
                 }
             },
             },
             {
             {
-                label: '订单状态', name: 'orderStatus', index: 'order_status',align: 'center', width: 100,
+                label: '订单状态', name: 'orderStatus', index: 'order_status',align: 'center', width: 80,
                 formatter: function (value) {
                 formatter: function (value) {
                     if (value == '0') {
                     if (value == '0') {
                         return '订单创建成功等待付款';
                         return '订单创建成功等待付款';
@@ -79,7 +79,7 @@ $(function () {
             //     }
             //     }
             // },
             // },
             {
             {
-                label: '付款状态', name: 'payStatus', index: 'pay_status',align: 'center', width: 60,
+                label: '付款状态', name: 'payStatus', index: 'pay_status',align: 'center', width: 50,
                 formatter: function (value) {
                 formatter: function (value) {
                     if (value == '0') {
                     if (value == '0') {
                         return '未付款';
                         return '未付款';
@@ -128,18 +128,37 @@ $(function () {
                 }
                 }
             },
             },
             {label: '人脸识别返回信息', name: 'recognitionReturnMsg', index: 'recognitionReturnMsg', align: 'center',width: 100},
             {label: '人脸识别返回信息', name: 'recognitionReturnMsg', index: 'recognitionReturnMsg', align: 'center',width: 100},
-            {label: '模板通知返回信息', name: 'tempNotiMsg', index: 'tempNotiMsg', align: 'center',width: 100},
+            {label: '模板通知返回信息', name: 'tempNotiMsg', index: 'tempNotiMsg', align: 'center',width: 90},
+            {label: '核验操作类型', name: 'checkOperatorType', index: 'checkOperatorType', align: 'center',width: 65,
+                formatter: function (value) {
+                    if (value == '1') {
+                        return '人脸活体识别';
+                    } else if (value == '2') {
+                        return '按钮审核身份';
+                    }else{
+                        return '-';
+                    }
+                    return value;
+                }},
             {
             {
-                label: '操作', width: 140, align: 'center', sortable: false,
+                label: '操作', width: 200, align: 'center', sortable: false,
                 formatter: function (value, col, row) {
                 formatter: function (value, col, row) {
                     let htmlStr = '';
                     let htmlStr = '';
                     // if (hasPermission('face:checkLivenessRecognition')) {
                     // if (hasPermission('face:checkLivenessRecognition')) {
+                    //isDateLast 该订单是否在可验证人脸时间内
                     if((row.isFaceCheck==0 || row.isFaceCheck == null) && row.isDateLast=='true' && row.payStatus==0 && row.orderStatus==0){
                     if((row.isFaceCheck==0 || row.isFaceCheck == null) && row.isDateLast=='true' && row.payStatus==0 && row.orderStatus==0){
                         htmlStr +='<button class="btn btn-outline btn-danger" onclick="vm.startCheckFace(' +
                         htmlStr +='<button class="btn btn-outline btn-danger" onclick="vm.startCheckFace(' +
                             row.id + ','+row.userId+','+row.thirdIsFaceCheck+')">人脸识别</button>&nbsp;';
                             row.id + ','+row.userId+','+row.thirdIsFaceCheck+')">人脸识别</button>&nbsp;';
                     }
                     }
                     // }
                     // }
-
+                    if((row.isFaceCheck==0 || row.isFaceCheck == null) && row.failCount >= 3 && row.payStatus==0 && row.orderStatus==0){
+                        htmlStr +='<button class="btn btn-outline btn-danger" onclick="vm.manualCheckFace(' +
+                            row.id + ','+row.thirdIsFaceCheck+')">审核人脸通过</button>&nbsp;';
+                    }
+                    if(row.isFaceCheck == 1 && row.failCount >= 3){
+                        htmlStr +='<button class="btn btn-outline btn-danger" onclick="vm.getCheckDetail(' +
+                            row.faceLivenessId + ','+row.thirdIsFaceCheck+')">审核明细</button>&nbsp;';
+                    }
                     if((row.isFaceCheck==0 || row.isFaceCheck == null) && row.isDateLast=='false' && row.payStatus==0 && row.orderStatus==0){
                     if((row.isFaceCheck==0 || row.isFaceCheck == null) && row.isDateLast=='false' && row.payStatus==0 && row.orderStatus==0){
                         htmlStr +='<span style="color: red">该订单用户在\n'+row.addSecondTime+'时间前\n可不再进行人脸识别</span>';
                         htmlStr +='<span style="color: red">该订单用户在\n'+row.addSecondTime+'时间前\n可不再进行人脸识别</span>';
                     }
                     }
@@ -182,6 +201,7 @@ var vm = new Vue({
         showList: 0,
         showList: 0,
         title: null,
         title: null,
         faceLivenessRecognition: {},
         faceLivenessRecognition: {},
+        checkFaceOperator: {},
         ruleValidate: {
         ruleValidate: {
             // approvalRemark: [
             // approvalRemark: [
             // {required: true, message: '审核备注不能为空', trigger: 'blur'}
             // {required: true, message: '审核备注不能为空', trigger: 'blur'}
@@ -427,6 +447,42 @@ var vm = new Vue({
             console.log(`访问用户媒体设备失败${error.name}, ${error.message}`);
             console.log(`访问用户媒体设备失败${error.name}, ${error.message}`);
             alert(`访问用户媒体设备失败${error.name}, ${error.message}`);
             alert(`访问用户媒体设备失败${error.name}, ${error.message}`);
         },
         },
+        manualCheckFace: function(rowId,thirdIsFaceCheck) {
+            if(thirdIsFaceCheck==1){
+                confirm('该订单人脸核身核验失败次数超过或等于3次,请您自行核验该会员身份信息,确认是本人后点击确定', function () {
+                    $.get("../face/manualCheckFace/" + rowId, function (r) {
+                        if (r.code === 0) {
+                            alert('操作成功', function (index) {
+                                vm.reload();
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    });
+                });
+            }else {
+                alert('请检查第三方商户需开放是否核验人脸开关');
+            }
+        },
+        getCheckDetail: function(faceLivenessId, thirdIsFaceCheck) {
+            if(thirdIsFaceCheck==1){
+                vm.showList = 3;
+                vm.title = "审核人脸身份操作人信息";
+                $.get("../face/get/" + faceLivenessId, function (r) {
+                    console.log(r)
+                    if (r.code === 0) {
+                        vm.checkFaceOperator = {
+                            checkOperatorType: r.faceLiveness.checkOperatorType,
+                            checkOperatorSn: r.faceLiveness.checkOperatorSn,
+                            // videoBase64: '1',
+                            checkOperatorTime: r.faceLiveness.checkOperatorTime
+                        };
+                    }
+                });
+            }else {
+                alert('请检查第三方商户需开放是否核验人脸开关');
+            }
+        },
         handleSubmit: function (name) {
         handleSubmit: function (name) {
             handleSubmitValidate(this, name, function () {
             handleSubmitValidate(this, name, function () {
                 vm.saveOrUpdate()
                 vm.saveOrUpdate()
@@ -434,7 +490,7 @@ var vm = new Vue({
         },
         },
         saveOrUpdate: function (event) {
         saveOrUpdate: function (event) {
             var that = this;
             var that = this;
-            let lodingMsg = that.$Message.loading('人脸验证中....', 6000);
+            let lodingMsg = that.$Message.loading('人脸验证中....');
 
 
             $('#sub').attr('disabled', true);
             $('#sub').attr('disabled', true);
             let url = '../face/checkLivenessRecognition';
             let url = '../face/checkLivenessRecognition';

+ 1 - 0
kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java

@@ -548,6 +548,7 @@ public class ApiOrderService {
             face.setUserId(Integer.parseInt(String.valueOf(userVo.getId())));
             face.setUserId(Integer.parseInt(String.valueOf(userVo.getId())));
             face.setIsFaceCheck("0");
             face.setIsFaceCheck("0");
             face.setIsTempNoti("0");
             face.setIsTempNoti("0");
+            face.setCreateTime(new Date());
             apiFaceLivenessRecognitionReturnDataMapper.save(face);
             apiFaceLivenessRecognitionReturnDataMapper.save(face);
         }
         }
     }
     }

+ 32 - 0
kmall-common/src/main/java/com/kmall/common/constant/Dict.java

@@ -1627,4 +1627,36 @@ public class Dict {
             this.itemName = itemName;
             this.itemName = itemName;
         }
         }
     }
     }
+
+    /**
+     * 核验操作类型 1:人脸活体识别,2:按钮审核身份
+     */
+    public enum checkOperatorType {
+        item_1("1", "人脸活体识别"),
+        item_2("2", "按钮审核身份");
+
+        private String item;
+        private String itemName;
+
+        checkOperatorType(String item, String itemName) {
+            this.item = item;
+            this.itemName = itemName;
+        }
+
+        public String getItem() {
+            return item;
+        }
+
+        public void setItem(String item) {
+            this.item = item;
+        }
+
+        public String getItemName() {
+            return itemName;
+        }
+
+        public void setItemName(String itemName) {
+            this.itemName = itemName;
+        }
+    }
 }
 }

+ 9 - 1
kmall-manager/src/main/resources/conf/oms-merch.properties

@@ -18,9 +18,17 @@ merch.livenessRecognitionUrl=http://127.0.0.1:8680/al/faceid/livenessRecognition
 merch.quotaInquiryUrl=http://127.0.0.1:8680/al/cus/yearLimit
 merch.quotaInquiryUrl=http://127.0.0.1:8680/al/cus/yearLimit
 
 
 
 
-##oms\u751F\u4EA7\u73AF\u5883\u5BC6\u94A5
+###oms\u751F\u4EA7\u73AF\u5883\u5BC6\u94A5
 #merch.md5Salt=IxyIvP0sJqlUZinx
 #merch.md5Salt=IxyIvP0sJqlUZinx
 ##oms\u751F\u4EA7\u73AF\u5883\u6D3B\u4F53\u4EBA\u8138\u6838\u8EAB\u63A5\u53E3
 ##oms\u751F\u4EA7\u73AF\u5883\u6D3B\u4F53\u4EBA\u8138\u6838\u8EAB\u63A5\u53E3
 #merch.livenessRecognitionUrl=http://ws.ds-bay.com/al/faceid/livenessRecognition
 #merch.livenessRecognitionUrl=http://ws.ds-bay.com/al/faceid/livenessRecognition
 ##oms\u6D4B\u8BD5\u73AF\u5883\u8DE8\u5883\u989D\u5EA6\u67E5\u8BE2\u63A5\u53E3
 ##oms\u6D4B\u8BD5\u73AF\u5883\u8DE8\u5883\u989D\u5EA6\u67E5\u8BE2\u63A5\u53E3
 #merch.quotaInquiryUrl=http://ws.ds-bay.com/al/cus/yearLimit
 #merch.quotaInquiryUrl=http://ws.ds-bay.com/al/cus/yearLimit
+
+
+##oms\u5546\u6237\u6D4B\u8BD5\u73AF\u5883\u5BC6\u94A5
+#merch.md5Salt=IxyIvP0sJqlUZinx
+##oms\u751F\u4EA7\u73AF\u5883\u6D3B\u4F53\u4EBA\u8138\u6838\u8EAB\u63A5\u53E3
+#merch.livenessRecognitionUrl=http://wstest.ds-bay.com/al/faceid/livenessRecognition
+##oms\u6D4B\u8BD5\u73AF\u5883\u8DE8\u5883\u989D\u5EA6\u67E5\u8BE2\u63A5\u53E3
+#merch.quotaInquiryUrl=http://wstest.ds-bay.com/al/cus/yearLimit

+ 2 - 1
切换环境需要修改的.md

@@ -24,6 +24,7 @@
 
 
 7. 商户配置
 7. 商户配置
     文件目录:resources\conf\oms-merch.properties
     文件目录:resources\conf\oms-merch.properties
+        oms配置切换为生产环境配置
 
 
 8. 图片上传配置
 8. 图片上传配置
     文件目录:resources\conf\fastdfs.properties
     文件目录:resources\conf\fastdfs.properties
@@ -33,4 +34,4 @@
     服务器安装jdk1.8,微信退款回调信息解密需要在目录“jdk1.8.0_131\jre\lib\security”中
     服务器安装jdk1.8,微信退款回调信息解密需要在目录“jdk1.8.0_131\jre\lib\security”中
 替换local_policy.jar、US_export_policy.jar两个安全的jar文件
 替换local_policy.jar、US_export_policy.jar两个安全的jar文件
 
 
-10. cert安装目录配置在wx-mp.properties的certName中
+10. cert安装目录配置在wx-mp.properties的certName中