package com.dayu.qihealonelibrary.card; import com.dayu.baselibrary.tools.HexUtil; import com.dayu.qihealonelibrary.utils.CardCommon; import com.tencent.bugly.crashreport.CrashReport; 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 implements Serializable { public String cardType = CardCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后 A2叠加充值 public int arerNumber;//区域号(底位在前高位在后) public int deviceNumberl;//设备编号(底位在前高位在后) public short rechargeTimes;//充值次数 public int totalWater;//用户总用水量 底位在前,高位在后2位小数点 含两个小数点的整数 public int totalElectric;//总用电量位 底位在前,高位在后 1位小数点 含1位小数点的整数 public int balance;//剩余金额 底位在前 2位小数点,单位分 public int surplusWater;//剩余水量 底位在前 2位小数点 单位立方米 (跟价格一样先乘以100) public Calendar rechargeDate;// 购水时间 BCD /** * 通过byte转bean * * @param data */ public static UserCard getBean(List 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 = HexUtil.get16To10LowHightByBytes(arerNumberByte); byte[] deviceNumberlByte = new byte[2]; System.arraycopy(zero, 3, deviceNumberlByte, 0, deviceNumberlByte.length); userCard.deviceNumberl = HexUtil.get16To10LowHightByBytes(deviceNumberlByte); userCard.rechargeTimes = HexUtil.hexToByte(HexUtil.byteToHex(zero[5])); byte[] totalWaterByte = new byte[4]; System.arraycopy(zero, 6, totalWaterByte, 0, totalWaterByte.length); userCard.totalWater = HexUtil.get16To10LowHightByBytes(totalWaterByte); byte[] totalElectricByte = new byte[4]; System.arraycopy(zero, 10, totalElectricByte, 0, totalElectricByte.length); userCard.totalElectric = HexUtil.get16To10LowHightByBytes(totalElectricByte); //第1块解析 byte[] one = data.get(1); byte[] balanceByte = new byte[4]; System.arraycopy(one, 0, balanceByte, 0, balanceByte.length); userCard.balance =HexUtil.get16To10LowHightByBytes(balanceByte); byte[] surplusWaterByte = new byte[4]; System.arraycopy(one, 4, surplusWaterByte, 0, surplusWaterByte.length); userCard.surplusWater = HexUtil.get16To10LowHightByBytes(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 = new byte[2]; byte[] arerNumberDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(arerNumber)); System.arraycopy(arerNumberDatas, 0, arerNumberBytes, 0, arerNumberDatas.length); if (arerNumberBytes != null) { System.arraycopy(arerNumberBytes, 0, data, 1, arerNumberBytes.length); } //设备编号 byte[] deviceNumberlBytes = new byte[2]; byte[] deviceNumberlDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(deviceNumberl)); System.arraycopy(deviceNumberlDatas, 0, deviceNumberlBytes, 0, deviceNumberlDatas.length); if (deviceNumberlBytes != null) { System.arraycopy(deviceNumberlBytes, 0, data, 3, deviceNumberlBytes.length); } //充值次数 byte rechargeTimesByte = HexUtil.hexToByte(HexUtil.get10to16(rechargeTimes)); data[5] = rechargeTimesByte; //用户总用水量 byte[] totalWaterBytes = new byte[4]; byte[] totalWaterDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalWater)); System.arraycopy(totalWaterDatas, 0, totalWaterBytes, 0, totalWaterDatas.length); if (totalWaterBytes != null) { System.arraycopy(totalWaterBytes, 0, data, 6, totalWaterBytes.length); } //总用电量位 byte[] totalElectricBytes = new byte[4]; byte[] totalElectricDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalElectric)); System.arraycopy(totalElectricDatas, 0, totalElectricBytes, 0, totalElectricDatas.length); 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 = new byte[4]; byte[] balanceDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance)); System.arraycopy(balanceDatas, 0, balanceBytes, 0, balanceDatas.length); if (balanceBytes != null) { System.arraycopy(balanceBytes, 0, data, 0, balanceBytes.length); } byte[] surplusWaterBytes = new byte[4]; byte[] surplusWaterDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater)); System.arraycopy(surplusWaterDatas, 0, surplusWaterBytes, 0, surplusWaterDatas.length); if (surplusWaterBytes != null) { System.arraycopy(surplusWaterBytes, 0, data, 4, 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 = HexUtil.getIntToBCD(year)[0]; byte bcdMonth = HexUtil.getIntToBCD(month)[0]; byte bcdDay = HexUtil.getIntToBCD(day)[0]; 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 = new byte[4]; byte[] balanceDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance)); System.arraycopy(balanceDatas, 0, balanceBytes, 0, balanceDatas.length); if (balanceBytes != null) { System.arraycopy(balanceBytes, 0, data, 0, balanceBytes.length); } byte[] surplusWaterBytes = new byte[4]; byte[] surplusWaterDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater)); System.arraycopy(surplusWaterDatas, 0, surplusWaterBytes, 0, surplusWaterDatas.length); if (surplusWaterBytes != null) { System.arraycopy(surplusWaterBytes, 0, data, 4, 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 = HexUtil.getIntToBCD(year)[0]; byte bcdMonth = HexUtil.getIntToBCD(month)[0]; byte bcdDay = HexUtil.getIntToBCD(day)[0]; 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 int getArerNumber() { return arerNumber; } public void setArerNumber(int arerNumber) { this.arerNumber = arerNumber; } public int getDeviceNumberl() { return deviceNumberl; } public void setDeviceNumberl(int deviceNumberl) { this.deviceNumberl = deviceNumberl; } public short getRechargeTimes() { return rechargeTimes; } public void setRechargeTimes(short 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; } }