Browse Source

卡签停开 - 编码完成

GZBranch
wufasong 2 days ago
parent
commit
3512823d89

+ 95
- 0
app/src/main/java/com/huntersun/vkyes/etcopencard/project/api/bean/DeviceEnableInstResponse.java View File

@@ -0,0 +1,95 @@
package com.huntersun.vkyes.etcopencard.project.api.bean;
/**
* 设备启用/停用指令响应数据
*/
public class DeviceEnableInstResponse {
private int code;
private DeviceEnableInstData data;
private String message;
public DeviceEnableInstResponse() {
}
public DeviceEnableInstResponse(int code, DeviceEnableInstData data, String message) {
this.code = code;
this.data = data;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public DeviceEnableInstData getData() {
return data;
}
public void setData(DeviceEnableInstData data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
/**
* 设备启用/停用指令数据
*/
public static class DeviceEnableInstData {
private String cmd;
private String cmdType;
private int stepNo;
private String transOrderId;
public DeviceEnableInstData() {
}
public DeviceEnableInstData(String cmd, String cmdType, int stepNo, String transOrderId) {
this.cmd = cmd;
this.cmdType = cmdType;
this.stepNo = stepNo;
this.transOrderId = transOrderId;
}
public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public String getCmdType() {
return cmdType;
}
public void setCmdType(String cmdType) {
this.cmdType = cmdType;
}
public int getStepNo() {
return stepNo;
}
public void setStepNo(int stepNo) {
this.stepNo = stepNo;
}
public String getTransOrderId() {
return transOrderId;
}
public void setTransOrderId(String transOrderId) {
this.transOrderId = transOrderId;
}
}
}

+ 5
- 0
app/src/main/java/com/huntersun/vkyes/etcopencard/project/api/bean/IFCode.java View File

@@ -343,6 +343,11 @@ public class IFCode {
public static final String IFCODE_DEVICE_CANCEL_INST_APPLY = "iaw/deviceCancel/instApply";//设备注销指令初始化
public static final String IFCODE_DEVICE_CANCEL_INST_CALLBACK = "iaw/deviceCancel/instCallBack";//设备注销指令回传
public static final String IFCODE_DIVICE_CANCLE_REFUNDINFO_PAGE = "iaw/api/refundInfo/page";// 分页查询车辆注销退费信息
// 设备启用/停用相关接口
public static final String IFCODE_DEVICE_ENABLE_APPLY = "iaw/deviceEnable/apply";//设备启用/停用申请
public static final String IFCODE_DEVICE_ENABLE_INST_CALLBACK = "iaw/deviceEnable/instCallBack";//设备启用/停用指令回传
public static final String IFCODE_DIVICE_CANCLE_REFUNDINFO_ADDORUPDATE = "iaw/api/refundInfo/addOrUpdate";// 增加修改退费账号

public static final String IFCODE_CANCLE_BY_ORDER = "43d72061a84e4310abe631725e42c594";//通过订单号注销

+ 321
- 26
app/src/main/java/com/huntersun/vkyes/etcopencard/project/ui/activity/after/StartStopEtcActivity.java View File

@@ -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)

Loading…
Cancel
Save