2 changed files with 310 additions and 0 deletions
-
210Fix9_OrderSelectionActivity门禁状态检查实现说明.md
-
100app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java
@ -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中的门禁状态检查功能。当检测到需要弹出门禁不可用弹窗时,会立即关闭订单选择页面,确保用户能够及时了解门禁状态,提升了系统的用户体验和安全性。 |
||||
|
|
||||
|
该实现遵循了现有的门禁检查规范,并保持了与现有系统的良好兼容性。 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue