赵明涛 3 hours ago
parent
commit
24380b84ed
  1. 210
      Fix9_OrderSelectionActivity门禁状态检查实现说明.md
  2. 100
      app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java

210
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中的门禁状态检查功能。当检测到需要弹出门禁不可用弹窗时,会立即关闭订单选择页面,确保用户能够及时了解门禁状态,提升了系统的用户体验和安全性。
该实现遵循了现有的门禁检查规范,并保持了与现有系统的良好兼容性。

100
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();

Loading…
Cancel
Save