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 data) { try { if (data != null) { byte[] zero = data.get(0); byte[] one = data.get(1); byte[] two = data.get(2); if (zero != null && zero.length == 16) { UserCard userCard = new UserCard(); 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; } return null; } } 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; } }