package com.dayu.recharge.card;
|
|
import com.dayu.recharge.tools.BcdUtil;
|
import com.dayu.recharge.tools.HexUtil;
|
import com.dayu.recharge.utils.MyCommon;
|
|
import java.io.Serializable;
|
import java.util.Calendar;
|
import java.util.List;
|
|
/**
|
* Copyright (C), 2023,
|
* Author: zuo
|
* Date: 2023-11-07 9:37
|
* Description: 用户卡结构
|
*/
|
public class UserCard extends BaseCard implements Serializable {
|
public String cardType = MyCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后 A2叠加充值
|
|
public int rechargeTimes;//充值次数
|
|
public short swipeNumber;//刷卡次数 一般不用精细管控才用
|
|
public float electricityPrice;//电量单价 管理元可以修改
|
|
public String state = "00";//卡状态 返写查询充值时卡状态位
|
|
public int balance;//余额(单位为分)
|
|
public String addressCode;//行政区域
|
|
public Calendar rechargeDate;//购水时间
|
|
public String initPeasantCode;//用户注册编号
|
|
|
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();
|
}
|
|
/**
|
* 通过byte转bean
|
*
|
* @param data 读卡的数据
|
*/
|
public static UserCard getBean(List<byte[]> data) {
|
try {
|
UserCard userCard = new UserCard();
|
if (data != null) {
|
byte[] zero = data.get(0);
|
byte[] one = data.get(1);
|
byte[] two = data.get(2);
|
userCard.cardType = HexUtil.byteToHex(zero[0]);
|
userCard.rechargeTimes = HexUtil.get16to10(HexUtil.byteToHex(zero[1]));
|
byte[] swipeNumberBytes = new byte[2];
|
System.arraycopy(zero,2,swipeNumberBytes,0,swipeNumberBytes.length);
|
String swipeNumberHex = HexUtil.bytesToHex(swipeNumberBytes);
|
userCard.swipeNumber = (short) HexUtil.get16to10(swipeNumberHex);
|
byte[] electricityPriceBytes = new byte[4];
|
System.arraycopy(zero,4,electricityPriceBytes,0,electricityPriceBytes.length);
|
|
userCard.electricityPrice = HexUtil.hexToFloat(HexUtil.bytesToHex(electricityPriceBytes));
|
userCard.state = BcdUtil.bcdToStr(zero[8]);
|
byte[] balanceBytes = new byte[4];
|
System.arraycopy(zero,9,balanceBytes,0,balanceBytes.length);
|
|
userCard.balance = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(balanceBytes));
|
byte[] addressCodeBytes = new byte[6];
|
System.arraycopy(zero,13,addressCodeBytes,0,2);
|
System.arraycopy(two,11,addressCodeBytes,2,4);
|
userCard.addressCode = BcdUtil.bcdToStr(addressCodeBytes);
|
|
int year = 0;
|
int month = 0;
|
int day = 0;
|
int hour = 0;
|
int minute = 0;
|
int second = 0;
|
for (int i = 0; i < 6; i++) {
|
byte byteData = one[i + 4];
|
switch (i) {
|
case 0:
|
year = getBcdToInt(byteData);
|
break;
|
case 1:
|
month = getBcdToInt(byteData);
|
break;
|
case 2:
|
day = getBcdToInt(byteData);
|
break;
|
case 3:
|
hour = getBcdToInt(byteData);
|
break;
|
case 4:
|
minute = getBcdToInt(byteData);
|
break;
|
case 5:
|
second = getBcdToInt(byteData);
|
break;
|
}
|
}
|
Calendar calendar = Calendar.getInstance();
|
calendar.set(2000 + year, month, day, hour, minute, second);
|
byte[] initPeasantCodeBytes = new byte[16];
|
System.arraycopy(one,10,initPeasantCodeBytes,0,5);
|
System.arraycopy(two,0,initPeasantCodeBytes,5,11);
|
userCard.initPeasantCode = HexUtil.bytesToHex(initPeasantCodeBytes);
|
return userCard;
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
return null;
|
}
|
return null;
|
}
|
|
|
private static int getBcdToInt(byte data) {
|
return ((data & 0xF0) >> 4) * 10 + ((data & 0x0F));
|
}
|
|
|
/**
|
* 用户卡0块
|
*/
|
public class Zero {
|
public byte[] toByte() {
|
byte[] data = new byte[16];
|
data[0] = HexUtil.hexToByte(cardType);
|
try {
|
data[1] = HexUtil.hexToByte(HexUtil.get10to16(rechargeTimes));
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
byte[] swipeNumbers = HexUtil.hexToByteArray(HexUtil.get10to16(swipeNumber));
|
|
System.arraycopy(swipeNumbers, 0, data, 2, swipeNumbers.length);
|
|
byte[] electricityPrices = HexUtil.hexToByteArray(HexUtil.folatToHexString(electricityPrice));
|
|
System.arraycopy(electricityPrices, 0, data, 4, electricityPrices.length);
|
try {
|
data[8] = BcdUtil.strToBcd(state)[0];
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
byte[] balances = HexUtil.hexToByteArray(HexUtil.get10to16LowHigh(balance, 8));
|
|
System.arraycopy(balances, 0, data, 9, balances.length);
|
byte[] addresscodes = BcdUtil.strToBcd(addressCode);
|
System.arraycopy(addresscodes, 0, data, 13, 2);
|
data[15] = getByteSum(data);
|
return data;
|
}
|
|
}
|
|
/**
|
* 用户卡1块
|
*/
|
public class One {
|
|
public byte[] toBytes() {
|
byte[] data = new byte[16];
|
byte[] balances = HexUtil.hexToByteArray(HexUtil.get10to16LowHigh(balance, 8));
|
System.arraycopy(balances, 0, data, 0, balances.length);
|
if (rechargeDate != null) {
|
// 获取年、月、日、时、分、秒
|
|
// bcdBytes[0] = (byte) ((year / 1000) << 4) | (byte) (year % 1000 / 100); // 年份的十位和个位(高字节)
|
// bcdBytes[1] = (byte) ((year / 10 % 10) << 4) | (byte) (year % 10); // 年份的十位和个位(低字节)
|
int year = (rechargeDate.get(Calendar.YEAR)) % 1000;
|
int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
|
int day = rechargeDate.get(Calendar.DAY_OF_MONTH);
|
int hour = rechargeDate.get(Calendar.HOUR_OF_DAY);
|
int minute = rechargeDate.get(Calendar.MINUTE);
|
int second = rechargeDate.get(Calendar.SECOND);
|
|
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));
|
byte bcdHour = (byte) ((hour / 10) << 4 | (hour % 10));
|
byte bcdMinute = (byte) ((minute / 10) << 4 | (minute % 10));
|
byte bcdSecond = (byte) ((second / 10) << 4 | (second % 10));
|
|
data[4] = bcdYear;
|
data[5] = bcdMonth;
|
data[6] = bcdDay;
|
data[7] = bcdHour;
|
data[8] = bcdMinute;
|
data[9] = bcdSecond;
|
}
|
byte[] initPeasantCodes = HexUtil.hexToByteArray(initPeasantCode);
|
System.arraycopy(initPeasantCodes, 0, data, 10, 5);
|
data[15] = getByteSum(data);
|
return data;
|
}
|
|
|
}
|
|
/**
|
* 用户卡2块
|
*/
|
public class Two {
|
public byte[] toBytes() {
|
byte[] data = new byte[16];
|
byte[] initPeasantCodes = HexUtil.hexToByteArray(initPeasantCode);
|
System.arraycopy(initPeasantCodes, 5, data, 0, 11);
|
byte[] addresscodes = BcdUtil.strToBcd(addressCode);
|
data[11] = addresscodes[2];
|
data[12] = addresscodes[3];
|
data[13] = addresscodes[4];
|
data[14] = addresscodes[5];
|
data[15] = getByteSum(data);
|
return data;
|
}
|
}
|
|
|
public String getCardType() {
|
return cardType;
|
}
|
|
public void setCardType(String cardType) {
|
this.cardType = cardType;
|
}
|
|
public int getRechargeTimes() {
|
return rechargeTimes;
|
}
|
|
public void setRechargeTimes(int rechargeTimes) {
|
this.rechargeTimes = rechargeTimes;
|
}
|
|
|
public short getSwipeNumber() {
|
return swipeNumber;
|
}
|
|
public void setSwipeNumber(short swipeNumber) {
|
this.swipeNumber = swipeNumber;
|
}
|
|
public float getElectricityPrice() {
|
return electricityPrice;
|
}
|
|
public void setElectricityPrice(float electricityPrice) {
|
this.electricityPrice = electricityPrice;
|
}
|
|
public String getState() {
|
return state;
|
}
|
|
public void setState(String state) {
|
this.state = state;
|
}
|
|
public int getBalance() {
|
return balance;
|
}
|
|
public void setBalance(int balance) {
|
this.balance = balance;
|
}
|
|
public String getAddressCode() {
|
return addressCode;
|
}
|
|
public void setAddressCode(String addressCode) {
|
this.addressCode = addressCode;
|
}
|
|
public Calendar getRechargeDate() {
|
return rechargeDate;
|
}
|
|
public void setRechargeDate(Calendar rechargeDate) {
|
this.rechargeDate = rechargeDate;
|
}
|
|
public String getInitPeasantCode() {
|
return initPeasantCode;
|
}
|
|
public void setInitPeasantCode(String initPeasantCode) {
|
this.initPeasantCode = initPeasantCode;
|
}
|
|
|
}
|