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.

6.6 KiB

Fix 9 - OrderSelectionActivity门禁状态检查实现说明

问题描述

当处于OrderSelectionActivity页面进行订单选择核销时,如果检测到需要弹出门禁不可用弹窗(checkShow==true),此时需要立即关闭掉OrderSelectionActivity。

解决方案

🎯 核心实现逻辑

  1. 门禁状态检查集成:在OrderSelectionActivity中集成门禁不可用弹窗的检查功能
  2. 关键点拦截:在所有订单核销入口点添加门禁状态检查
  3. 立即关闭机制:当检测到门禁不可用时立即关闭Activity

🔧 技术实现

1. 添加必要的导入和变量

// 新增导入
import com.ouxuan.oxface.abgate.GateUnavailableDialog; // 门禁不可用弹窗
import com.ouxuan.oxface.utils.VenueSceneUtils; // 场景工具类
import com.blankj.utilcode.util.NetworkUtils; // 网络工具类

// 新增成员变量
private GateUnavailableDialog gateUnavailableDialog;

2. 初始化门禁状态检查

private void initGateStatusCheck() {
    try {
        // 初始化门禁不可用弹窗实例(仅用于检查,不显示)
        gateUnavailableDialog = new GateUnavailableDialog(this);
        LogManager.logInfo(TAG, "门禁状态检查初始化完成");
    } catch (Exception e) {
        LogManager.logError(TAG, "门禁状态检查初始化失败", e);
    }
}

3. 核心检查方法

private boolean checkGateStatusAndCloseIfNeeded() {
    try {
        // 检查网络是否可用
        boolean isNetworkAvailable = isNetworkAvailable();
        
        // 检查是否需要显示门禁不可用弹窗
        if (gateUnavailableDialog != null) {
            boolean shouldShow = gateUnavailableDialog.checkShow(this, isNetworkAvailable);
            
            if (shouldShow) {
                LogManager.logWarning(TAG, "Fix 9 - 检测到需要弹出门禁不可用弹窗,立即关闭订单选择页面");
                
                // 停止倒计时
                stopCountdown();
                
                // 设置结果为取消并关闭Activity
                setResult(RESULT_CANCELED);
                finish();
                
                return true; // 表示已关闭Activity
            }
        }
        
        return false; // 门禁状态正常,不需要关闭Activity
        
    } catch (Exception e) {
        LogManager.logError(TAG, "检查门禁状态失败", e);
        return false; // 异常情况下不关闭Activity
    }
}

4. 在关键点添加检查

确认按钮点击时:

btnConfirm.setOnClickListener(v -> {
    // Fix 9: 在执行核销前检查门禁状态
    if (checkGateStatusAndCloseIfNeeded()) {
        return; // 门禁不可用,已关闭Activity
    }
    
    // 正常执行核销逻辑
    OrderVerificationData.OrderItem selectedOrder = adapter.getSelectedOrder();
    if (selectedOrder != null) {
        performOrderVerification(selectedOrder);
    } else {
        showToast("请选择要核销的订单");
    }
});

直接核销按钮点击时:

@Override
public void onVerifyClick(OrderVerificationData.OrderItem order, int position) {
    // Fix 9: 在直接核销前检查门禁状态
    if (checkGateStatusAndCloseIfNeeded()) {
        return; // 门禁不可用,已关闭Activity
    }
    
    // 直接核销选中的订单
    performOrderVerification(order);
}

订单核销方法开始时:

private void performOrderVerification(OrderVerificationData.OrderItem order) {
    LogManager.logInfo(TAG, "执行订单核销: " + order.getOrder_no());
    
    // Fix 9: 在订单核销前检查门禁状态,如果需要弹出门禁不可用弹窗,立即关闭Activity
    if (checkGateStatusAndCloseIfNeeded()) {
        LogManager.logInfo(TAG, "检测到门禁不可用,立即关闭订单选择页面");
        return; // 立即返回,不继续执行核销
    }
    
    // 继续执行原有的核销逻辑...
}

5. 网络状态检查支持

private boolean isNetworkAvailable() {
    try {
        // 使用NetworkUtils检查网络连接状态
        if (!NetworkUtils.isConnected()) {
            LogManager.logWarning(TAG, "网络未连接");
            return false;
        }
        
        LogManager.logDebug(TAG, "网络状态正常");
        return true;
        
    } catch (Exception e) {
        LogManager.logError(TAG, "检查网络状态失败", e);
        return false;
    }
}

6. 资源释放

@Override
protected void onDestroy() {
    super.onDestroy();
    stopCountdown();
    
    // 释放门禁弹窗资源
    if (gateUnavailableDialog != null) {
        gateUnavailableDialog.release();
        gateUnavailableDialog = null;
    }
    
    // ... 其他资源释放逻辑
}

🚀 实现特点

1. 多层拦截机制

  • 确认按钮拦截:防止用户点击确认按钮时触发核销
  • 直接核销拦截:防止用户直接点击订单的核销按钮
  • 核销方法拦截:在最终执行核销前再次检查

2. 门禁状态检查逻辑

  • 使用GateUnavailableDialog.checkShow()方法检查是否需要显示门禁不可用弹窗
  • 考虑网络状态和设备场景(进场/离场)
  • 遵循现有的门禁检查规范

3. 优雅关闭机制

  • 停止倒计时避免资源浪费
  • 设置正确的Activity结果(RESULT_CANCELED)
  • 释放门禁弹窗相关资源

4. 异常处理

  • 所有关键方法都有异常捕获
  • 异常情况下不影响正常流程(默认不关闭Activity)
  • 详细的日志记录便于调试

验证结果

  1. 编译验证 无编译错误
  2. 逻辑验证 在所有订单核销入口都添加了门禁状态检查
  3. 资源管理 正确释放相关资源
  4. 异常处理 完整的异常处理机制

📝 使用场景

当用户在订单选择页面尝试核销订单时:

  1. 门禁正常:正常执行订单核销流程
  2. 门禁异常
    • 立即关闭OrderSelectionActivity
    • 返回到主页面
    • 主页面会显示相应的门禁不可用弹窗
    • 用户可以看到具体的门禁状态信息

🔧 配置要求

无需额外配置,Fix 9 会自动:

  • 根据当前设备场景(进场/离场)判断
  • 根据网络状态进行检查
  • 遵循现有的门禁检查业务规则

总结

Fix 9 成功实现了在OrderSelectionActivity中的门禁状态检查功能。当检测到需要弹出门禁不可用弹窗时,会立即关闭订单选择页面,确保用户能够及时了解门禁状态,提升了系统的用户体验和安全性。

该实现遵循了现有的门禁检查规范,并保持了与现有系统的良好兼容性。