# 门禁控制逻辑重构说明 ## 问题描述 用户反馈:"现在检测到人脸后,直接调用了开门是不对的,应该在人脸识别成功后,进场核销完订单,或者离场操作后才执行开B门。" ## 原有问题 在原有的 `checkResultOnline()` 方法中存在以下问题: 1. **人脸识别成功后立即开门**:无论网络状态如何,系统在人脸识别成功后都会立即开启门禁 2. **网络异常时的不安全行为**:当网络不可用时,系统直接跳过验证步骤开门 3. **缺乏业务流程控制**:没有按照正确的业务流程(人脸识别 → 网络验证 → 开门)执行 ## 重构方案 ### 1. 移除人脸识别成功后的立即开门逻辑 **修改文件**:`OXFaceOnlineActivity.java` **修改方法**:`checkResultOnline()` **具体修改**: - 移除了网络不可用时的直接开门代码 - 改为显示网络连接提示,等待网络恢复 - 保持安全性,不在未验证时开启门禁 ### 2. 门禁开启时机调整 门禁开启现在仅在以下情况下执行: #### 进场场景 1. 人脸识别成功 → 获取base64图像数据 2. 执行订单核销网络请求 3. **网络验证成功后** → 在 `onVerificationSuccess()` 回调中开启B门 #### 离场场景 1. 人脸识别成功 → 获取base64图像数据 2. 执行离场校验网络请求 3. **网络验证成功后** → 在 `onLeaveVerificationSuccess()` 回调中开启B门 ### 3. 网络异常处理 **原有逻辑**:网络不可用时直接开门(不安全) ```java // 移除的代码 if (isUDPInitialized && udpExample != null) { LogManager.logInfo(TAG, "网络不可用,直接开启B门"); udpExample.handleFaceRecognitionSuccess(true); } ``` **新逻辑**:网络不可用时等待网络恢复 ```java // 新增的安全逻辑 LogManager.logWarning(TAG, "检测到场景,但网络不可用"); showLoadingStatus("无网络连接,请检查网络设置"); LogManager.logInfo(TAG, "网络不可用,等待网络恢复"); ``` ## 代码变更详情 ### checkResultOnline() 方法修改 **离场场景修改**: ```java // 修改前(不安全) } else { LogManager.logWarning(TAG, "检测到离场场景,但网络不可用,直接开启B门"); // 直接开门的不安全代码... } // 修改后(安全) } else { LogManager.logWarning(TAG, "检测到离场场景,但网络不可用"); showLoadingStatus("无网络连接,请检查网络设置"); LogManager.logInfo(TAG, "离场场景网络不可用,等待网络恢复"); } ``` **进场场景修改**: ```java // 修改前(不安全) } else { LogManager.logWarning(TAG, "检测到进场场景,但网络不可用,直接开启B门"); // 直接开门的不安全代码... } // 修改后(安全) } else { LogManager.logWarning(TAG, "检测到进场场景,但网络不可用"); showLoadingStatus("无网络连接,请检查网络设置"); LogManager.logInfo(TAG, "进场场景网络不可用,等待网络恢复"); } ``` ### 保持的门禁开启逻辑 以下回调中的门禁开启逻辑**保持不变**: 1. **订单核销成功回调**: ```java @Override public void onVerificationSuccess(CheckOrderResult data, int verificationType) { // 订单核销成功后开启B门 if (isUDPInitialized && udpExample != null) { LogManager.logInfo(TAG, "订单核销成功,开启B门"); udpExample.handleFaceRecognitionSuccess(true); } orderVerificationResultHandler.handleVerificationSuccess(data, verificationType); } ``` 2. **离场校验成功回调**: ```java @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. **边界情况测试**: - 验证失败时:不应开门 - 验证超时时:不应开门 - 网络间歇性中断:应等待网络稳定后再验证 ## 总结 此次重构解决了关键的安全问题,确保门禁系统严格按照业务流程执行:**人脸识别成功 → 网络验证成功 → 门禁开启**。这样的流程更加安全可靠,符合实际业务需求。