oxFaceAndroid
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.7 KiB

门禁控制逻辑重构说明

问题描述

用户反馈:"现在检测到人脸后,直接调用了开门是不对的,应该在人脸识别成功后,进场核销完订单,或者离场操作后才执行开B门。"

原有问题

在原有的 checkResultOnline() 方法中存在以下问题:

  1. 人脸识别成功后立即开门:无论网络状态如何,系统在人脸识别成功后都会立即开启门禁
  2. 网络异常时的不安全行为:当网络不可用时,系统直接跳过验证步骤开门
  3. 缺乏业务流程控制:没有按照正确的业务流程(人脸识别 → 网络验证 → 开门)执行

重构方案

1. 移除人脸识别成功后的立即开门逻辑

修改文件OXFaceOnlineActivity.java

修改方法checkResultOnline()

具体修改

  • 移除了网络不可用时的直接开门代码
  • 改为显示网络连接提示,等待网络恢复
  • 保持安全性,不在未验证时开启门禁

2. 门禁开启时机调整

门禁开启现在仅在以下情况下执行:

进场场景

  1. 人脸识别成功 → 获取base64图像数据
  2. 执行订单核销网络请求
  3. 网络验证成功后 → 在 onVerificationSuccess() 回调中开启B门

离场场景

  1. 人脸识别成功 → 获取base64图像数据
  2. 执行离场校验网络请求
  3. 网络验证成功后 → 在 onLeaveVerificationSuccess() 回调中开启B门

3. 网络异常处理

原有逻辑:网络不可用时直接开门(不安全)

// 移除的代码
if (isUDPInitialized && udpExample != null) {
    LogManager.logInfo(TAG, "网络不可用,直接开启B门");
    udpExample.handleFaceRecognitionSuccess(true);
}

新逻辑:网络不可用时等待网络恢复

// 新增的安全逻辑
LogManager.logWarning(TAG, "检测到场景,但网络不可用");
showLoadingStatus("无网络连接,请检查网络设置");
LogManager.logInfo(TAG, "网络不可用,等待网络恢复");

代码变更详情

checkResultOnline() 方法修改

离场场景修改

// 修改前(不安全)
} else {
    LogManager.logWarning(TAG, "检测到离场场景,但网络不可用,直接开启B门");
    // 直接开门的不安全代码...
}

// 修改后(安全)
} else {
    LogManager.logWarning(TAG, "检测到离场场景,但网络不可用");
    showLoadingStatus("无网络连接,请检查网络设置");
    LogManager.logInfo(TAG, "离场场景网络不可用,等待网络恢复");
}

进场场景修改

// 修改前(不安全)
} else {
    LogManager.logWarning(TAG, "检测到进场场景,但网络不可用,直接开启B门");
    // 直接开门的不安全代码...
}

// 修改后(安全)
} else {
    LogManager.logWarning(TAG, "检测到进场场景,但网络不可用");
    showLoadingStatus("无网络连接,请检查网络设置");
    LogManager.logInfo(TAG, "进场场景网络不可用,等待网络恢复");
}

保持的门禁开启逻辑

以下回调中的门禁开启逻辑保持不变

  1. 订单核销成功回调
@Override
public void onVerificationSuccess(CheckOrderResult data, int verificationType) {
    // 订单核销成功后开启B门
    if (isUDPInitialized && udpExample != null) {
        LogManager.logInfo(TAG, "订单核销成功,开启B门");
        udpExample.handleFaceRecognitionSuccess(true);
    }
    orderVerificationResultHandler.handleVerificationSuccess(data, verificationType);
}
  1. 离场校验成功回调
@Override
public void onLeaveVerificationSuccess(CheckLeaveResult result) {
    // 离场校验成功后开启B门
    if (isUDPInitialized && udpExample != null) {
        LogManager.logInfo(TAG, "离场校验成功,开启B门");
        udpExample.handleFaceRecognitionSuccess(false);
    }
}

新的业务流程

进场流程

人脸识别成功 → 获取base64图像 → 网络可用检查 → 执行订单核销 → 核销成功 → 开启B门
                                         ↓ 网络不可用
                                    显示网络错误提示,等待网络恢复

离场流程

人脸识别成功 → 获取base64图像 → 网络可用检查 → 执行离场校验 → 校验成功 → 开启B门
                                         ↓ 网络不可用
                                    显示网络错误提示,等待网络恢复

安全性提升

  1. 消除了未授权开门风险:网络异常时不再直接开门
  2. 增强了业务流程控制:严格按照验证流程执行
  3. 提供了用户友好的错误提示:网络异常时显示明确的错误信息
  4. 保持了网络恢复后的自动处理:配合现有的网络恢复监听机制

兼容性说明

  • 所有现有的网络验证回调保持不变
  • UDP门禁控制接口保持不变
  • 用户界面显示逻辑保持不变
  • 仅修改了人脸识别成功后的处理逻辑

测试建议

  1. 正常网络环境测试

    • 进场场景:人脸识别 → 订单核销 → B门开启
    • 离场场景:人脸识别 → 离场校验 → B门开启
  2. 网络异常环境测试

    • 断网状态下人脸识别:应显示网络错误提示,不开门
    • 网络恢复后:应能正常执行验证和开门流程
  3. 边界情况测试

    • 验证失败时:不应开门
    • 验证超时时:不应开门
    • 网络间歇性中断:应等待网络稳定后再验证

总结

此次重构解决了关键的安全问题,确保门禁系统严格按照业务流程执行:人脸识别成功 → 网络验证成功 → 门禁开启。这样的流程更加安全可靠,符合实际业务需求。