|
|
@@ -20,12 +20,15 @@ import com.huntersun.vkyes.etcopencard.project.utils.FunHelper; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.utils.SearchCarInfoUtils; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.api.bean.VehicleQueryDeviceRequest; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.api.bean.VehicleQueryDeviceResponse; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.api.bean.DeviceEnableInstResponse; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.utils.Constants; |
|
|
|
import com.blankj.utilcode.util.LogUtils; |
|
|
|
import com.google.gson.Gson; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.parkingwang.keyboard.PopupKeyboard; |
|
|
|
import com.hjq.toast.ToastUtils; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.bluetooth.MethodManager; |
|
|
|
import com.huntersun.vkyes.etcopencard.project.bluetooth.ServiceStatus; |
|
|
|
import com.huntersun.vkyes.etcopencard.src.aop.SingleClick; |
|
|
|
import com.huntersun.vkyes.etcopencard.src.app.AppActivity; |
|
|
|
|
|
|
@@ -49,6 +52,10 @@ public class StartStopEtcActivity extends AppActivity { |
|
|
|
|
|
|
|
//操作 1-停用 2-启用 |
|
|
|
private int operation = -1; |
|
|
|
|
|
|
|
// 指令执行相关变量 |
|
|
|
private int currentStepNo = 1; // 当前步骤号 |
|
|
|
private String transOrderId = ""; // 指令编号 |
|
|
|
|
|
|
|
@Override |
|
|
|
protected View getLayoutView() { |
|
|
@@ -366,38 +373,326 @@ public class StartStopEtcActivity extends AppActivity { |
|
|
|
new Utils().showMessDialog(getActivity(), "是否确认" + actionText + "卡签?", new Utils.dialogCallback() { |
|
|
|
@Override |
|
|
|
public void onConfirm(BaseDialog dialog) { |
|
|
|
showDialog("申请中..."); |
|
|
|
Map<String, String> params = new HashMap<>(); |
|
|
|
params.put("cardId", curBizContent.getCardId()); |
|
|
|
params.put("orderId", curBizContent.getOrderId()); |
|
|
|
params.put("operation", String.valueOf(operation)); |
|
|
|
// params.put("agentId", "52010106004"); |
|
|
|
params.put("agentId", MyShared.getInstance().get(MyShared.AGENCYID,"").toString()); |
|
|
|
params.put("channelId", MyShared.getInstance().get(MyShared.CHANNELID,"").toString()); |
|
|
|
params.put("channelType", "1"); |
|
|
|
params.put("terminalId", "999999999999"); |
|
|
|
params.put("TerminalId", "999999999999"); |
|
|
|
params.put("staffId", (String) MyShared.getInstance().get(MyShared.STAFFID, "")); |
|
|
|
MyRetrofit.newInstance(IFCode.IFCODE892, params, new MyRetrofit.ReturnResult() { |
|
|
|
@Override |
|
|
|
public void onSuccess(ResultBean resultBean, ResultBean.BizContent bizContent) { |
|
|
|
hideDialog(); |
|
|
|
toWriteCardCommand(bizContent); |
|
|
|
// 调用设备启用/停用申请接口 |
|
|
|
callDeviceEnableApply(); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 调用设备启用/停用申请接口 |
|
|
|
*/ |
|
|
|
private void callDeviceEnableApply() { |
|
|
|
showDialog("申请中..."); |
|
|
|
|
|
|
|
HashMap<String, Object> params = new HashMap<>(); |
|
|
|
params.put("accessToken", MyShared.getInstance().get(MyShared.ACCESSTOKEN, "") + ""); |
|
|
|
params.put("loginSource", Constants.LOGIN_SOURCE); |
|
|
|
params.put("staffId", MyShared.getInstance().get(MyShared.STAFFID, "")); |
|
|
|
params.put("cardId", curBizContent.getCardId()); |
|
|
|
params.put("obuId", curBizContent.getObuId()); |
|
|
|
params.put("vehicleId", plateNum + "_" + colorNum); |
|
|
|
params.put("customerId", MyShared.getInstance().get(MyShared.STAFFID, "") + ""); |
|
|
|
params.put("enableStatus", operation == 1 ? "DISABLE" : "ENABLE"); // 1-停用,2-启用 |
|
|
|
|
|
|
|
LogUtils.i("设备启用/停用申请", "请求参数: " + new Gson().toJson(params)); |
|
|
|
|
|
|
|
MyRetrofit.newInstanceGZ(this, IFCode.IFCODE_DEVICE_ENABLE_APPLY, params, new MyRetrofit.ReturnResult() { |
|
|
|
@Override |
|
|
|
public void onSuccess(ResultBean resultBean, ResultBean.BizContent bizContent) { |
|
|
|
hideDialog(); |
|
|
|
LogUtils.i("设备启用/停用申请", "响应数据: " + new Gson().toJson(resultBean)); |
|
|
|
|
|
|
|
if (resultBean.getCode() == 0) { |
|
|
|
// 申请成功,解析响应数据获取指令信息 |
|
|
|
parseEnableApplyResponse(resultBean); |
|
|
|
} else { |
|
|
|
ToastUtils.show(resultBean.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onError(Response<Result> resp) { |
|
|
|
hideDialog(); |
|
|
|
LogUtils.e("设备启用/停用申请", "申请失败: " + (resp != null ? resp.message() : "未知错误")); |
|
|
|
ToastUtils.show("申请失败,请重试"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 解析启用/停用申请响应 |
|
|
|
*/ |
|
|
|
private void parseEnableApplyResponse(ResultBean resultBean) { |
|
|
|
try { |
|
|
|
if (resultBean.getData() != null) { |
|
|
|
String dataStr = JSONObject.toJSONString(resultBean.getData()); |
|
|
|
LogUtils.i("解析申请响应", "响应原始数据: " + dataStr); |
|
|
|
JSONObject dataObj = JSONObject.parseObject(dataStr); |
|
|
|
String cmd = dataObj.getString("cmd"); |
|
|
|
String cmdType = dataObj.getString("cmdType"); |
|
|
|
Integer stepNo = dataObj.getInteger("stepNo"); |
|
|
|
String transOrderId = dataObj.getString("transOrderId"); |
|
|
|
|
|
|
|
LogUtils.i("解析申请响应", "解析结果 - cmd: " + cmd + ", cmdType: " + cmdType + |
|
|
|
", stepNo: " + stepNo + ", transOrderId: " + transOrderId); |
|
|
|
|
|
|
|
if (!FunHelper.isEmpty(cmd)) { |
|
|
|
// 有指令需要执行,先连接ETC设备 |
|
|
|
this.transOrderId = transOrderId; |
|
|
|
this.currentStepNo = stepNo != null ? stepNo : 1; |
|
|
|
connectDeviceAndExecute(); |
|
|
|
} else { |
|
|
|
LogUtils.i("解析申请响应", "无需执行指令,操作完成"); |
|
|
|
showSuccessPage(); |
|
|
|
} |
|
|
|
} else { |
|
|
|
LogUtils.i("解析申请响应", "响应数据为空,操作完成"); |
|
|
|
showSuccessPage(); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
LogUtils.e("解析申请响应", "解析响应失败: " + e.getMessage()); |
|
|
|
e.printStackTrace(); |
|
|
|
ToastUtils.show("解析响应失败"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 连接ETC设备并执行指令 |
|
|
|
*/ |
|
|
|
private void connectDeviceAndExecute() { |
|
|
|
LogUtils.i("连接ETC设备", "开始连接ETC设备"); |
|
|
|
|
|
|
|
// 连接蓝牙设备 |
|
|
|
bluetoothLink(new Currency() { |
|
|
|
@Override |
|
|
|
public void success() { |
|
|
|
LogUtils.i("连接ETC设备", "蓝牙连接成功,开始执行指令"); |
|
|
|
// 蓝牙连接成功,执行指令 |
|
|
|
executeEnableDisableCommand(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void success9901(int isPlk) { |
|
|
|
LogUtils.i("连接ETC设备", "9901设备连接成功,开始执行指令"); |
|
|
|
// 9901设备连接成功,执行指令 |
|
|
|
executeEnableDisableCommand(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void close() { |
|
|
|
LogUtils.e("连接ETC设备", "设备连接失败"); |
|
|
|
// 连接失败 |
|
|
|
ToastUtils.show("设备连接失败,请重试"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 执行启用/停用指令流程 |
|
|
|
*/ |
|
|
|
private void executeEnableDisableCommand() { |
|
|
|
LogUtils.i("执行启用/停用指令", "开始执行指令流程,当前步骤号: " + currentStepNo + ", 指令编号: " + transOrderId); |
|
|
|
|
|
|
|
// 从申请响应中已经获取了第一个指令,直接执行 |
|
|
|
// 这里需要从申请响应中获取cmd,但由于我们已经解析过了,需要重新获取 |
|
|
|
// 为了简化,我们直接调用指令回传接口获取下一个指令 |
|
|
|
getNextCommand(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取下一个指令 |
|
|
|
*/ |
|
|
|
private void getNextCommand() { |
|
|
|
showDialog("正在获取指令..."); |
|
|
|
|
|
|
|
HashMap<String, Object> params = new HashMap<>(); |
|
|
|
params.put("accessToken", MyShared.getInstance().get(MyShared.ACCESSTOKEN, "") + ""); |
|
|
|
params.put("loginSource", Constants.LOGIN_SOURCE); |
|
|
|
params.put("cmd", ""); // 第一次调用时cmd为空 |
|
|
|
params.put("cmdResult", ""); // 第一次调用时cmdResult为空 |
|
|
|
params.put("customerId", MyShared.getInstance().get(MyShared.STAFFID, "") + ""); |
|
|
|
params.put("stepNo", currentStepNo); |
|
|
|
params.put("transOrderId", transOrderId); |
|
|
|
|
|
|
|
LogUtils.i("获取指令", "请求参数: " + new Gson().toJson(params)); |
|
|
|
|
|
|
|
MyRetrofit.newInstanceGZ(this, IFCode.IFCODE_DEVICE_ENABLE_INST_CALLBACK, params, new MyRetrofit.ReturnResult() { |
|
|
|
@Override |
|
|
|
public void onSuccess(ResultBean resultBean, ResultBean.BizContent bizContent) { |
|
|
|
hideDialog(); |
|
|
|
LogUtils.i("获取指令", "响应数据: " + new Gson().toJson(resultBean)); |
|
|
|
|
|
|
|
try { |
|
|
|
if (resultBean.getData() != null) { |
|
|
|
String dataStr = JSONObject.toJSONString(resultBean.getData()); |
|
|
|
LogUtils.i("获取指令", "响应原始数据: " + dataStr); |
|
|
|
JSONObject dataObj = JSONObject.parseObject(dataStr); |
|
|
|
String cmd = dataObj.getString("cmd"); |
|
|
|
String cmdType = dataObj.getString("cmdType"); |
|
|
|
Integer stepNo = dataObj.getInteger("stepNo"); |
|
|
|
String transOrderId = dataObj.getString("transOrderId"); |
|
|
|
|
|
|
|
LogUtils.i("获取指令", "解析结果 - cmd: " + cmd + ", cmdType: " + cmdType + |
|
|
|
", stepNo: " + stepNo + ", transOrderId: " + transOrderId); |
|
|
|
|
|
|
|
if (!FunHelper.isEmpty(cmd)) { |
|
|
|
// 有指令需要执行 |
|
|
|
executeWriteCard(cmd, transOrderId); |
|
|
|
} else { |
|
|
|
LogUtils.i("获取指令", "无需执行指令,操作完成"); |
|
|
|
showSuccessPage(); |
|
|
|
} |
|
|
|
} else { |
|
|
|
LogUtils.e("获取指令", "获取指令失败:响应数据为空"); |
|
|
|
ToastUtils.show("获取指令失败:响应数据为空"); |
|
|
|
} |
|
|
|
@Override |
|
|
|
public void onError(Response<Result> resp) { |
|
|
|
hideDialog(); |
|
|
|
if (null!=resp){ |
|
|
|
showErrorMsg(resp.body().errorMsg); |
|
|
|
} catch (Exception e) { |
|
|
|
LogUtils.e("获取指令", "解析指令响应失败: " + e.getMessage()); |
|
|
|
e.printStackTrace(); |
|
|
|
ToastUtils.show("解析指令响应失败"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onError(Response<Result> resp) { |
|
|
|
hideDialog(); |
|
|
|
LogUtils.e("获取指令", "获取指令失败: " + (resp != null ? resp.message() : "未知错误")); |
|
|
|
ToastUtils.show("获取指令失败"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 执行写卡操作 |
|
|
|
*/ |
|
|
|
private void executeWriteCard(String command, String transOrderId) { |
|
|
|
LogUtils.i("执行写卡", "开始写卡操作,指令: " + command + ", 指令编号: " + transOrderId); |
|
|
|
|
|
|
|
try { |
|
|
|
String result = writeCard(command); |
|
|
|
LogUtils.i("执行写卡", "写卡操作完成,结果: " + result); |
|
|
|
|
|
|
|
// 回传指令结果 |
|
|
|
callbackEnableDisableCommand(command, transOrderId, result); |
|
|
|
} catch (Exception e) { |
|
|
|
LogUtils.e("执行写卡", "写卡操作异常: " + e.getMessage()); |
|
|
|
e.printStackTrace(); |
|
|
|
ToastUtils.show("写卡操作失败: " + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 写卡操作 |
|
|
|
*/ |
|
|
|
private String writeCard(String command) { |
|
|
|
LogUtils.i("写卡操作", "开始写卡操作,指令: " + command); |
|
|
|
try { |
|
|
|
ServiceStatus resp_string = MethodManager.sendApduICC(command); |
|
|
|
String result = resp_string.getServiceInfo(); |
|
|
|
LogUtils.i("写卡操作", "指令执行结果: " + result); |
|
|
|
|
|
|
|
if (resp_string.getServiceCode() != 0) { |
|
|
|
LogUtils.e("写卡操作", "指令执行失败,状态码: " + resp_string.getServiceCode()); |
|
|
|
throw new RuntimeException("指令执行失败,状态码: " + resp_string.getServiceCode()); |
|
|
|
} |
|
|
|
|
|
|
|
LogUtils.i("写卡操作", "写卡操作完成,结果: " + result); |
|
|
|
return result; |
|
|
|
} catch (Exception e) { |
|
|
|
LogUtils.e("写卡操作", "写卡操作异常: " + e.getMessage()); |
|
|
|
e.printStackTrace(); |
|
|
|
throw new RuntimeException("写卡操作异常: " + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 回传启用/停用指令结果 |
|
|
|
*/ |
|
|
|
private void callbackEnableDisableCommand(String command, String transOrderId, String result) { |
|
|
|
HashMap<String, Object> params = new HashMap<>(); |
|
|
|
params.put("accessToken", MyShared.getInstance().get(MyShared.ACCESSTOKEN, "") + ""); |
|
|
|
params.put("loginSource", Constants.LOGIN_SOURCE); |
|
|
|
params.put("cmd", command); |
|
|
|
params.put("cmdResult", result); |
|
|
|
params.put("customerId", MyShared.getInstance().get(MyShared.STAFFID, "") + ""); |
|
|
|
params.put("stepNo", currentStepNo); |
|
|
|
params.put("transOrderId", transOrderId); |
|
|
|
|
|
|
|
LogUtils.i("指令回传", "请求参数: " + new Gson().toJson(params)); |
|
|
|
LogUtils.i("指令回传", "当前步骤: " + currentStepNo + ", 指令: " + command + |
|
|
|
", 指令编号: " + transOrderId + ", 指令结果: " + result); |
|
|
|
|
|
|
|
MyRetrofit.newInstanceGZ(this, IFCode.IFCODE_DEVICE_ENABLE_INST_CALLBACK, params, new MyRetrofit.ReturnResult() { |
|
|
|
@Override |
|
|
|
public void onSuccess(ResultBean resultBean, ResultBean.BizContent bizContent) { |
|
|
|
LogUtils.i("指令回传", "响应数据: " + new Gson().toJson(resultBean)); |
|
|
|
|
|
|
|
try { |
|
|
|
if (resultBean.getData() != null) { |
|
|
|
String dataStr = JSONObject.toJSONString(resultBean.getData()); |
|
|
|
LogUtils.i("指令回传", "响应原始数据: " + dataStr); |
|
|
|
JSONObject dataObj = JSONObject.parseObject(dataStr); |
|
|
|
String cmd = dataObj.getString("cmd"); |
|
|
|
String cmdType = dataObj.getString("cmdType"); |
|
|
|
Integer stepNo = dataObj.getInteger("stepNo"); |
|
|
|
String transOrderId = dataObj.getString("transOrderId"); |
|
|
|
|
|
|
|
LogUtils.i("指令回传", "解析结果 - cmd: " + cmd + ", cmdType: " + cmdType + |
|
|
|
", stepNo: " + stepNo + ", transOrderId: " + transOrderId); |
|
|
|
|
|
|
|
if (stepNo != null && stepNo == 100) { |
|
|
|
// stepNo = 100 表示所有指令已经执行完毕 |
|
|
|
LogUtils.i("指令回传", "所有指令执行完毕,stepNo = 100,启用/停用成功"); |
|
|
|
showSuccessPage(); |
|
|
|
} else if (stepNo != null && stepNo > 0 && stepNo != 100) { |
|
|
|
// 更新步骤号和指令编号 |
|
|
|
currentStepNo = stepNo; |
|
|
|
StartStopEtcActivity.this.transOrderId = transOrderId; |
|
|
|
|
|
|
|
if (!FunHelper.isEmpty(cmd)) { |
|
|
|
LogUtils.i("指令回传", "需要继续写卡,下一步骤号: " + stepNo + |
|
|
|
",当前步骤号更新为: " + currentStepNo + ",开始下一轮循环"); |
|
|
|
executeWriteCard(cmd, transOrderId); |
|
|
|
} else { |
|
|
|
LogUtils.i("指令回传", "写卡完成,启用/停用成功,步骤号: " + stepNo + ",循环结束"); |
|
|
|
showSuccessPage(); |
|
|
|
} |
|
|
|
} else { |
|
|
|
LogUtils.i("指令回传", "写卡完成,启用/停用成功,步骤号: " + stepNo + ",循环结束"); |
|
|
|
// 操作完成,显示成功页面 |
|
|
|
showSuccessPage(); |
|
|
|
} |
|
|
|
// else { |
|
|
|
// showErrorMsg("请求超时"); |
|
|
|
// } |
|
|
|
} else { |
|
|
|
LogUtils.e("指令回传", "指令回传失败:响应数据为空"); |
|
|
|
ToastUtils.show("指令回传失败:响应数据为空"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} catch (Exception e) { |
|
|
|
LogUtils.e("指令回传", "解析指令回传响应失败: " + e.getMessage()); |
|
|
|
e.printStackTrace(); |
|
|
|
ToastUtils.show("解析指令回传响应失败"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onError(Response<Result> resp) { |
|
|
|
LogUtils.e("指令回传", "指令回传失败: " + (resp != null ? resp.message() : "未知错误")); |
|
|
|
ToastUtils.show("指令回传失败"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 显示成功页面 |
|
|
|
*/ |
|
|
|
private void showSuccessPage() { |
|
|
|
hideDialog(); |
|
|
|
String actionText = operation == 1 ? "停用" : "启用"; |
|
|
|
ToastUtils.show(actionText + "成功"); |
|
|
|
|
|
|
|
// 可以跳转到成功页面或返回上一页 |
|
|
|
finish(); |
|
|
|
} |
|
|
|
private void showErrorMsg(String errorMsg){ |
|
|
|
if (null==errorMsg||"".equals(errorMsg))return; |
|
|
|
new ConfirmDialog.Builder(StartStopEtcActivity.this).setMsg(errorMsg, "无法办理","确定","", R.mipmap.icon_lotgout_etc_hint, 0,true) |