package com.dayu.recharge.card;
|
|
import com.dayu.recharge.tools.BcdUtil;
|
import com.dayu.recharge.tools.HexUtil;
|
import com.dayu.recharge.utils.MornyUtil;
|
import com.dayu.recharge.utils.MyCommon;
|
import com.tencent.bugly.crashreport.CrashReport;
|
|
import java.io.Serializable;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* Copyright (C), 2023,
|
* Author: zuo
|
* Date: 2023-11-07 9:37
|
* Description: 齐河项目用户卡结构
|
*/
|
public class UserCard implements Serializable {
|
public String cardType = MyCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后 A2叠加充值
|
|
public short arerNumber;//区域号(底位在前高位在后)
|
|
public short deviceNumberl;//设备编号(底位在前高位在后)
|
public byte rechargeTimes;//充值次数
|
|
public int totalWater;//用户总用水量 底位在前,高位在后2位小数点 含两个小数点的整数
|
|
public int totalElectric;//总用电量位 底位在前,高位在后 1位小数点 含1位小数点的整数
|
|
public int balance;//剩余金额 底位在前 2位小数点,单位元
|
|
public int surplusWater;//剩余水量 底位在前 2位小数点 单位立方米
|
|
public Calendar rechargeDate;// 购水时间 BCD
|
|
|
/**
|
* 通过byte转bean
|
*
|
* @param data
|
*/
|
public static UserCard getBean(List<byte[]> data) {
|
try {
|
UserCard userCard = new UserCard();
|
//第0块解析
|
byte[] zero = data.get(0);
|
|
userCard.cardType = HexUtil.byteToHex(zero[0]);
|
|
byte[] arerNumberByte = new byte[2];
|
System.arraycopy(zero, 1, arerNumberByte, 0, arerNumberByte.length);
|
userCard.arerNumber = (short) HexUtil.get16to10LowHigh(HexUtil.bytesToHex(arerNumberByte));
|
|
byte[] deviceNumberlByte = new byte[2];
|
System.arraycopy(zero, 3, deviceNumberlByte, 0, deviceNumberlByte.length);
|
userCard.deviceNumberl = (short) HexUtil.get16to10LowHigh(HexUtil.bytesToHex(deviceNumberlByte));
|
|
userCard.rechargeTimes = HexUtil.hexToByte(HexUtil.byteToHex(zero[5]));
|
|
byte[] totalWaterByte = new byte[4];
|
System.arraycopy(zero, 3, totalWaterByte, 0, totalWaterByte.length);
|
userCard.totalWater = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(totalWaterByte));
|
|
byte[] totalElectricByte = new byte[4];
|
System.arraycopy(zero, 3, totalElectricByte, 0, totalElectricByte.length);
|
userCard.totalElectric = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(totalElectricByte));
|
|
//第1块解析
|
byte[] one = data.get(1);
|
|
byte[] balanceByte = new byte[4];
|
System.arraycopy(one, 0, balanceByte, 0, balanceByte.length);
|
userCard.balance = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(balanceByte));
|
|
byte[] surplusWaterByte = new byte[4];
|
System.arraycopy(one, 4, surplusWaterByte, 0, surplusWaterByte.length);
|
userCard.surplusWater = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(surplusWaterByte));
|
|
byte[] rechargeDateByte = new byte[3];
|
System.arraycopy(one, 12, rechargeDateByte, 0, rechargeDateByte.length);
|
|
int year = HexUtil.getBcdToInt(one[12]);
|
int month = HexUtil.getBcdToInt(one[13]);
|
int day = HexUtil.getBcdToInt(one[14]);
|
|
Calendar calendar = Calendar.getInstance();
|
calendar.set(2000 + year, month, day, 0, 0, 0);
|
userCard.rechargeDate = calendar;
|
|
return userCard;
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
return null;
|
}
|
|
}
|
|
|
/**
|
* 用户卡0块
|
*/
|
public class Zero extends BaseCard {
|
public byte[] toByte() {
|
try {
|
byte[] data = new byte[16];
|
data[0] = HexUtil.hexToByte(cardType);
|
byte[] arerNumberBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(arerNumber));
|
if (arerNumberBytes != null) {
|
System.arraycopy(arerNumberBytes, 0, data, 1, arerNumberBytes.length);
|
}
|
byte[] deviceNumberlBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(deviceNumberl));
|
if (deviceNumberlBytes != null) {
|
System.arraycopy(deviceNumberlBytes, 0, data, 3, deviceNumberlBytes.length);
|
}
|
byte rechargeTimesByte = HexUtil.hexToByte(HexUtil.get10to16(rechargeTimes));
|
data[5] = rechargeTimesByte;
|
byte[] totalWaterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalWater));
|
if (totalWaterBytes != null) {
|
System.arraycopy(totalWaterBytes, 0, data, 6, totalWaterBytes.length);
|
}
|
byte[] totalElectricBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalElectric));
|
if (totalElectricBytes != null) {
|
System.arraycopy(totalElectricBytes, 0, data, 10, totalElectricBytes.length);
|
}
|
data[15] = getByteSum(data);
|
return data;
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return null;
|
}
|
|
}
|
|
/**
|
* 用户卡1块
|
*/
|
public class One extends BaseCard {
|
|
public byte[] toBytes() {
|
byte[] data = new byte[16];
|
|
|
try {
|
byte[] balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance));
|
if (balanceBytes != null) {
|
System.arraycopy(balanceBytes, 0, data, 0, balanceBytes.length);
|
}
|
|
byte[] surplusWaterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater));
|
if (surplusWaterBytes != null) {
|
System.arraycopy(surplusWaterBytes, 0, data, 0, surplusWaterBytes.length);
|
}
|
|
|
if (rechargeDate != null) {
|
// 获取年、月、日、时、分、秒
|
int year = (rechargeDate.get(Calendar.YEAR)) % 1000;
|
int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
|
int day = rechargeDate.get(Calendar.DAY_OF_MONTH);
|
byte bcdYear = (byte) ((year / 10) << 4 | ((year % 10) / 100));
|
byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
|
byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
|
data[12] = bcdYear;
|
data[13] = bcdMonth;
|
data[14] = bcdDay;
|
}
|
|
data[15] = getByteSum(data);
|
} catch (Exception e) {
|
e.printStackTrace();
|
CrashReport.postCatchedException(e);
|
}
|
return data;
|
}
|
|
|
}
|
|
/**
|
* 用户卡2块
|
*/
|
public class Two extends BaseCard {
|
public byte[] toBytes() {
|
byte[] data = new byte[16];
|
|
try {
|
byte[] balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance));
|
if (balanceBytes != null) {
|
System.arraycopy(balanceBytes, 0, data, 0, balanceBytes.length);
|
}
|
|
byte[] surplusWaterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater));
|
if (surplusWaterBytes != null) {
|
System.arraycopy(surplusWaterBytes, 0, data, 0, surplusWaterBytes.length);
|
}
|
|
if (rechargeDate != null) {
|
// 获取年、月、日、时、分、秒
|
int year = (rechargeDate.get(Calendar.YEAR)) % 1000;
|
int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
|
int day = rechargeDate.get(Calendar.DAY_OF_MONTH);
|
byte bcdYear = (byte) ((year / 10) << 4 | ((year % 10) / 100));
|
byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
|
byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
|
data[12] = bcdYear;
|
data[13] = bcdMonth;
|
data[14] = bcdDay;
|
}
|
|
data[15] = getByteSum(data);
|
} catch (Exception e) {
|
e.printStackTrace();
|
CrashReport.postCatchedException(e);
|
}
|
return data;
|
}
|
}
|
|
public byte[] getZeroBytes() {
|
Zero zero = new Zero();
|
return zero.toByte();
|
}
|
|
public byte[] getOneBytes() {
|
One zero = new One();
|
return zero.toBytes();
|
}
|
|
public byte[] getTwoBytes() {
|
Two zero = new Two();
|
return zero.toBytes();
|
}
|
|
|
public String getCardType() {
|
return cardType;
|
}
|
|
public void setCardType(String cardType) {
|
this.cardType = cardType;
|
}
|
|
public short getArerNumber() {
|
return arerNumber;
|
}
|
|
public void setArerNumber(short arerNumber) {
|
this.arerNumber = arerNumber;
|
}
|
|
public short getDeviceNumberl() {
|
return deviceNumberl;
|
}
|
|
public void setDeviceNumberl(short deviceNumberl) {
|
this.deviceNumberl = deviceNumberl;
|
}
|
|
public byte getRechargeTimes() {
|
return rechargeTimes;
|
}
|
|
public void setRechargeTimes(byte rechargeTimes) {
|
this.rechargeTimes = rechargeTimes;
|
}
|
|
public int getTotalWater() {
|
return totalWater;
|
}
|
|
public void setTotalWater(int totalWater) {
|
this.totalWater = totalWater;
|
}
|
|
public int getTotalElectric() {
|
return totalElectric;
|
}
|
|
public void setTotalElectric(int totalElectric) {
|
this.totalElectric = totalElectric;
|
}
|
|
public int getBalance() {
|
return balance;
|
}
|
|
public void setBalance(int balance) {
|
this.balance = balance;
|
}
|
|
public int getSurplusWater() {
|
return surplusWater;
|
}
|
|
public void setSurplusWater(int surplusWater) {
|
this.surplusWater = surplusWater;
|
}
|
|
public Calendar getRechargeDate() {
|
return rechargeDate;
|
}
|
|
public void setRechargeDate(Calendar rechargeDate) {
|
this.rechargeDate = rechargeDate;
|
}
|
|
|
}
|