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