|
@ -86,71 +86,54 @@ public class ABGateManager { |
|
|
* 检测AB门状态和人数,判断是否可用 |
|
|
* 检测AB门状态和人数,判断是否可用 |
|
|
* 主要入口方法:先检查门状态,再检查人数 |
|
|
* 主要入口方法:先检查门状态,再检查人数 |
|
|
* |
|
|
* |
|
|
* @param callback 检查结果回调 |
|
|
|
|
|
|
|
|
* @return true表示可用(A门关闭 AND B门关闭 AND 人数符合要求),false表示不可用 |
|
|
*/ |
|
|
*/ |
|
|
public void checkGateABBeforeToDo(ABGateCheckCallback callback) { |
|
|
|
|
|
|
|
|
public boolean checkGateABBeforeToDo() { |
|
|
LogManager.logInfo(TAG, "开始执行AB门检查流程"); |
|
|
LogManager.logInfo(TAG, "开始执行AB门检查流程"); |
|
|
|
|
|
|
|
|
if (callback == null) { |
|
|
|
|
|
LogManager.logError(TAG, "回调参数为空"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 第一步:检查AB门状态 |
|
|
|
|
|
LogManager.logInfo(TAG, "第一步:检查AB门状态"); |
|
|
|
|
|
ABGateCheck(new ABGateCheckCallback() { |
|
|
|
|
|
@Override |
|
|
|
|
|
public void onSuccess(boolean gateAvailable) { |
|
|
|
|
|
if (gateAvailable) { |
|
|
|
|
|
LogManager.logInfo(TAG, "门状态检查通过,开始第二步:检查门内人数"); |
|
|
|
|
|
// 第二步:检查门内人数 |
|
|
|
|
|
ABPeopleCheck(new ABGateCheckCallback() { |
|
|
|
|
|
@Override |
|
|
|
|
|
public void onSuccess(boolean peopleCheckPassed) { |
|
|
|
|
|
LogManager.logInfo(TAG, "人数检查完成,最终结果: " + peopleCheckPassed); |
|
|
|
|
|
callback.onSuccess(peopleCheckPassed); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
// 第一步:检查AB门状态 |
|
|
|
|
|
LogManager.logInfo(TAG, "第一步:检查AB门状态"); |
|
|
|
|
|
boolean gateCheckResult = ABGateCheck(); |
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public void onError(String errorMessage) { |
|
|
|
|
|
LogManager.logError(TAG, "人数检查失败: " + errorMessage); |
|
|
|
|
|
callback.onError("人数检查失败: " + errorMessage); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
} else { |
|
|
|
|
|
LogManager.logWarning(TAG, "门状态检查未通过,AB门当前不可用"); |
|
|
|
|
|
callback.onSuccess(false); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!gateCheckResult) { |
|
|
|
|
|
LogManager.logWarning(TAG, "门状态检查未通过,AB门当前不可用"); |
|
|
|
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public void onError(String errorMessage) { |
|
|
|
|
|
LogManager.logError(TAG, "门状态检查失败: " + errorMessage); |
|
|
|
|
|
callback.onError("门状态检查失败: " + errorMessage); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
LogManager.logInfo(TAG, "门状态检查通过,开始第二步:检查门内人数"); |
|
|
|
|
|
|
|
|
|
|
|
// 第二步:检查门内人数 |
|
|
|
|
|
boolean peopleCheckResult = ABPeopleCheck(); |
|
|
|
|
|
|
|
|
|
|
|
// 两个条件都为true时才返回true |
|
|
|
|
|
boolean finalResult = gateCheckResult && peopleCheckResult; |
|
|
|
|
|
LogManager.logInfo(TAG, "AB门检查完成 - 门状态: " + gateCheckResult + |
|
|
|
|
|
", 人数检查: " + peopleCheckResult + |
|
|
|
|
|
", 最终结果: " + finalResult); |
|
|
|
|
|
|
|
|
|
|
|
return finalResult; |
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
LogManager.logError(TAG, "AB门检查异常: " + e.getMessage(), e); |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* AB门状态检查 |
|
|
* AB门状态检查 |
|
|
* 逻辑:A门关闭 AND B门关闭 时才返回true,否则返回false |
|
|
* 逻辑:A门关闭 AND B门关闭 时才返回true,否则返回false |
|
|
* |
|
|
* |
|
|
* @param callback 检查结果回调 |
|
|
|
|
|
|
|
|
* @return true表示A门和B门都关闭,false表示有门开启 |
|
|
*/ |
|
|
*/ |
|
|
public void ABGateCheck(ABGateCheckCallback callback) { |
|
|
|
|
|
|
|
|
public boolean ABGateCheck() { |
|
|
LogManager.logInfo(TAG, "执行AB门状态检查"); |
|
|
LogManager.logInfo(TAG, "执行AB门状态检查"); |
|
|
|
|
|
|
|
|
if (callback == null) { |
|
|
|
|
|
LogManager.logError(TAG, "ABGateCheck回调参数为空"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 检查UDP是否初始化 |
|
|
// 检查UDP是否初始化 |
|
|
if (!oxUDP.isInitialized()) { |
|
|
if (!oxUDP.isInitialized()) { |
|
|
String errorMsg = "UDP门禁控制器未初始化"; |
|
|
String errorMsg = "UDP门禁控制器未初始化"; |
|
|
LogManager.logError(TAG, errorMsg); |
|
|
LogManager.logError(TAG, errorMsg); |
|
|
callback.onError(errorMsg); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
throw new RuntimeException(errorMsg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
@ -194,26 +177,15 @@ public class ABGateManager { |
|
|
oxUDP.queryGateState(); |
|
|
oxUDP.queryGateState(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 异步处理结果,设置超时 |
|
|
|
|
|
gateCheckFuture |
|
|
|
|
|
.orTimeout(GATE_CHECK_TIMEOUT, TimeUnit.MILLISECONDS) |
|
|
|
|
|
.whenComplete((result, throwable) -> { |
|
|
|
|
|
mainHandler.post(() -> { |
|
|
|
|
|
if (throwable != null) { |
|
|
|
|
|
String errorMsg = "门状态检查超时或异常: " + throwable.getMessage(); |
|
|
|
|
|
LogManager.logError(TAG, errorMsg); |
|
|
|
|
|
callback.onError(errorMsg); |
|
|
|
|
|
} else { |
|
|
|
|
|
LogManager.logInfo(TAG, "门状态检查完成,结果: " + result); |
|
|
|
|
|
callback.onSuccess(result); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
// 同步等待结果,设置超时 |
|
|
|
|
|
boolean result = gateCheckFuture.get(GATE_CHECK_TIMEOUT, TimeUnit.MILLISECONDS); |
|
|
|
|
|
LogManager.logInfo(TAG, "门状态检查完成,结果: " + result); |
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
String errorMsg = "门状态检查异常: " + e.getMessage(); |
|
|
String errorMsg = "门状态检查异常: " + e.getMessage(); |
|
|
LogManager.logError(TAG, errorMsg, e); |
|
|
LogManager.logError(TAG, errorMsg, e); |
|
|
callback.onError(errorMsg); |
|
|
|
|
|
|
|
|
throw new RuntimeException(errorMsg); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -223,9 +195,9 @@ public class ABGateManager { |
|
|
* - 进场设备:门内人数 > 1 时不可用(返回false) |
|
|
* - 进场设备:门内人数 > 1 时不可用(返回false) |
|
|
* - 离场设备:门内人数 != 0 时不可用(返回false) |
|
|
* - 离场设备:门内人数 != 0 时不可用(返回false) |
|
|
* |
|
|
* |
|
|
* @param callback 检查结果回调 |
|
|
|
|
|
|
|
|
* @return true表示人数符合要求,false表示人数不符合要求 |
|
|
*/ |
|
|
*/ |
|
|
public void ABPeopleCheck(ABGateCheckCallback callback) { |
|
|
|
|
|
|
|
|
public boolean ABPeopleCheck() { |
|
|
LogManager.logInfo(TAG, "执行AB门内人数检查"); |
|
|
LogManager.logInfo(TAG, "执行AB门内人数检查"); |
|
|
|
|
|
|
|
|
if (callback == null) { |
|
|
if (callback == null) { |
|
@ -308,7 +280,31 @@ public class ABGateManager { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 同步方式检查AB门状态和人数(阻塞方法) |
|
|
|
|
|
|
|
|
* 检测AB门状态和人数,判断是否可用。异步版本。 |
|
|
|
|
|
* 主要入口方法:先检查门状态,再检查人数 |
|
|
|
|
|
* |
|
|
|
|
|
* @param callback 检查结果回调 |
|
|
|
|
|
*/ |
|
|
|
|
|
public void checkGateABBeforeToDoAsync(ABGateCheckCallback callback) { |
|
|
|
|
|
LogManager.logInfo(TAG, "开始执行异步AB门检查流程"); |
|
|
|
|
|
|
|
|
|
|
|
if (callback == null) { |
|
|
|
|
|
LogManager.logError(TAG, "回调参数为空"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 在后台线程执行同步检查 |
|
|
|
|
|
new Thread(() -> { |
|
|
|
|
|
try { |
|
|
|
|
|
boolean result = checkGateABBeforeToDo(); |
|
|
|
|
|
mainHandler.post(() -> callback.onSuccess(result)); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
String errorMsg = "AB门检查异常: " + e.getMessage(); |
|
|
|
|
|
LogManager.logError(TAG, errorMsg, e); |
|
|
|
|
|
mainHandler.post(() -> callback.onError(errorMsg)); |
|
|
|
|
|
} |
|
|
|
|
|
}).start(); |
|
|
|
|
|
} |
|
|
* 注意:此方法会阻塞当前线程,不建议在主线程调用 |
|
|
* 注意:此方法会阻塞当前线程,不建议在主线程调用 |
|
|
* |
|
|
* |
|
|
* @return true表示可用,false表示不可用 |
|
|
* @return true表示可用,false表示不可用 |
|
@ -317,27 +313,8 @@ public class ABGateManager { |
|
|
public boolean checkGateABBeforeToDoSync() throws Exception { |
|
|
public boolean checkGateABBeforeToDoSync() throws Exception { |
|
|
LogManager.logInfo(TAG, "执行同步AB门检查"); |
|
|
LogManager.logInfo(TAG, "执行同步AB门检查"); |
|
|
|
|
|
|
|
|
CompletableFuture<Boolean> future = new CompletableFuture<>(); |
|
|
|
|
|
|
|
|
|
|
|
checkGateABBeforeToDo(new ABGateCheckCallback() { |
|
|
|
|
|
@Override |
|
|
|
|
|
public void onSuccess(boolean canProceed) { |
|
|
|
|
|
future.complete(canProceed); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public void onError(String errorMessage) { |
|
|
|
|
|
future.completeExceptionally(new RuntimeException(errorMessage)); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
// 总超时时间为门状态检查 + 人数检查的时间 |
|
|
|
|
|
return future.get(GATE_CHECK_TIMEOUT + PEOPLE_CHECK_TIMEOUT + 2000, TimeUnit.MILLISECONDS); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
LogManager.logError(TAG, "同步检查异常", e); |
|
|
|
|
|
throw e; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 直接调用主方法 |
|
|
|
|
|
return checkGateABBeforeToDo(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|