diff --git a/Fix9_OrderSelectionActivity门禁状态检查实现说明.md b/Fix9_OrderSelectionActivity门禁状态检查实现说明.md new file mode 100644 index 0000000..7771bb0 --- /dev/null +++ b/Fix9_OrderSelectionActivity门禁状态检查实现说明.md @@ -0,0 +1,210 @@ +# Fix 9 - OrderSelectionActivity门禁状态检查实现说明 + +## 问题描述 +当处于OrderSelectionActivity页面进行订单选择核销时,如果检测到需要弹出门禁不可用弹窗(checkShow==true),此时需要立即关闭掉OrderSelectionActivity。 + +## 解决方案 + +### 🎯 核心实现逻辑 +1. **门禁状态检查集成**:在OrderSelectionActivity中集成门禁不可用弹窗的检查功能 +2. **关键点拦截**:在所有订单核销入口点添加门禁状态检查 +3. **立即关闭机制**:当检测到门禁不可用时立即关闭Activity + +### 🔧 技术实现 + +#### 1. 添加必要的导入和变量 +```java +// 新增导入 +import com.ouxuan.oxface.abgate.GateUnavailableDialog; // 门禁不可用弹窗 +import com.ouxuan.oxface.utils.VenueSceneUtils; // 场景工具类 +import com.blankj.utilcode.util.NetworkUtils; // 网络工具类 + +// 新增成员变量 +private GateUnavailableDialog gateUnavailableDialog; +``` + +#### 2. 初始化门禁状态检查 +```java +private void initGateStatusCheck() { + try { + // 初始化门禁不可用弹窗实例(仅用于检查,不显示) + gateUnavailableDialog = new GateUnavailableDialog(this); + LogManager.logInfo(TAG, "门禁状态检查初始化完成"); + } catch (Exception e) { + LogManager.logError(TAG, "门禁状态检查初始化失败", e); + } +} +``` + +#### 3. 核心检查方法 +```java +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. 在关键点添加检查 + +**确认按钮点击时:** +```java +btnConfirm.setOnClickListener(v -> { + // Fix 9: 在执行核销前检查门禁状态 + if (checkGateStatusAndCloseIfNeeded()) { + return; // 门禁不可用,已关闭Activity + } + + // 正常执行核销逻辑 + OrderVerificationData.OrderItem selectedOrder = adapter.getSelectedOrder(); + if (selectedOrder != null) { + performOrderVerification(selectedOrder); + } else { + showToast("请选择要核销的订单"); + } +}); +``` + +**直接核销按钮点击时:** +```java +@Override +public void onVerifyClick(OrderVerificationData.OrderItem order, int position) { + // Fix 9: 在直接核销前检查门禁状态 + if (checkGateStatusAndCloseIfNeeded()) { + return; // 门禁不可用,已关闭Activity + } + + // 直接核销选中的订单 + performOrderVerification(order); +} +``` + +**订单核销方法开始时:** +```java +private void performOrderVerification(OrderVerificationData.OrderItem order) { + LogManager.logInfo(TAG, "执行订单核销: " + order.getOrder_no()); + + // Fix 9: 在订单核销前检查门禁状态,如果需要弹出门禁不可用弹窗,立即关闭Activity + if (checkGateStatusAndCloseIfNeeded()) { + LogManager.logInfo(TAG, "检测到门禁不可用,立即关闭订单选择页面"); + return; // 立即返回,不继续执行核销 + } + + // 继续执行原有的核销逻辑... +} +``` + +#### 5. 网络状态检查支持 +```java +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. 资源释放 +```java +@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中的门禁状态检查功能。当检测到需要弹出门禁不可用弹窗时,会立即关闭订单选择页面,确保用户能够及时了解门禁状态,提升了系统的用户体验和安全性。 + +该实现遵循了现有的门禁检查规范,并保持了与现有系统的良好兼容性。 \ No newline at end of file diff --git a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java index 41b5d82..548fd6a 100644 --- a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java @@ -25,6 +25,9 @@ import com.ouxuan.oxface.orderOX.model.OrderVerificationData; import com.ouxuan.oxface.utils.LogManager; import com.ouxuan.oxface.data.LoginDataManager; import com.ouxuan.oxface.data.DeviceSelectDataManager; // 添加设备数据管理器导入 +import com.ouxuan.oxface.abgate.GateUnavailableDialog; // 门禁不可用弹窗 +import com.ouxuan.oxface.utils.VenueSceneUtils; // 场景工具类 +import com.blankj.utilcode.util.NetworkUtils; // 网络工具类 import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.bumptech.glide.request.RequestOptions; @@ -64,6 +67,9 @@ public class OrderSelectionActivity extends AppCompatActivity { private LoginDataManager loginDataManager; // 设备数据管理器 private DeviceSelectDataManager deviceDataManager; + + // 门禁状态检查相关变量 + private GateUnavailableDialog gateUnavailableDialog; @Override protected void onCreate(Bundle savedInstanceState) { @@ -87,6 +93,9 @@ public class OrderSelectionActivity extends AppCompatActivity { // 初始化设备数据管理器 deviceDataManager = DeviceSelectDataManager.getInstance(this); + // 初始化门禁状态检查 + initGateStatusCheck(); + initViews(); initData(); setupListeners(); @@ -191,6 +200,11 @@ public class OrderSelectionActivity extends AppCompatActivity { @Override public void onVerifyClick(OrderVerificationData.OrderItem order, int position) { + // Fix 9: 在直接核销前检查门禁状态 + if (checkGateStatusAndCloseIfNeeded()) { + return; // 门禁不可用,已关闭Activity + } + // 直接核销选中的订单 performOrderVerification(order); } @@ -228,6 +242,11 @@ public class OrderSelectionActivity extends AppCompatActivity { private void setupListeners() { // 确认按钮 btnConfirm.setOnClickListener(v -> { + // Fix 9: 在执行核销前检查门禁状态 + if (checkGateStatusAndCloseIfNeeded()) { + return; // 门禁不可用,已关闭Activity + } + OrderVerificationData.OrderItem selectedOrder = adapter.getSelectedOrder(); if (selectedOrder != null) { performOrderVerification(selectedOrder); @@ -257,6 +276,12 @@ public class OrderSelectionActivity extends AppCompatActivity { private void performOrderVerification(OrderVerificationData.OrderItem order) { LogManager.logInfo(TAG, "执行订单核销: " + order.getOrder_no()); + // Fix 9: 在订单核销前检查门禁状态,如果需要弹出门禁不可用弹窗,立即关闭Activity + if (checkGateStatusAndCloseIfNeeded()) { + LogManager.logInfo(TAG, "检测到门禁不可用,立即关闭订单选择页面"); + return; // 立即返回,不继续执行核销 + } + // 停止倒计时 stopCountdown(); @@ -562,6 +587,12 @@ public class OrderSelectionActivity extends AppCompatActivity { super.onDestroy(); stopCountdown(); + // 释放门禁弹窗资源 + if (gateUnavailableDialog != null) { + gateUnavailableDialog.release(); + gateUnavailableDialog = null; + } + // 取消注册广播接收器 if (forceCloseReceiver != null) { try { @@ -656,6 +687,75 @@ public class OrderSelectionActivity extends AppCompatActivity { } } + /** + * 初始化门禁状态检查 + */ + private void initGateStatusCheck() { + try { + // 初始化门禁不可用弹窗实例(仅用于检查,不显示) + gateUnavailableDialog = new GateUnavailableDialog(this); + LogManager.logInfo(TAG, "门禁状态检查初始化完成"); + } catch (Exception e) { + LogManager.logError(TAG, "门禁状态检查初始化失败", e); + } + } + + /** + * 检查门禁状态,如果需要弹窗则关闭Activity + * @return true 如果已关闭Activity, false 如果门禁状态正常 + */ + 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 + } + } + + /** + * 检查网络是否可用 + * @return true 如果网络可用,false 否则 + */ + 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; + } + } + @Override public void onBackPressed() { super.onBackPressed();