|  |  | 
 |  |  | package com.dayu.qiheonlinelibrary.card; | 
 |  |  |  | 
 |  |  | import com.dayu.baselibrary.bean.BaseUserCardCard; | 
 |  |  | import com.dayu.baselibrary.tools.BcdUtil; | 
 |  |  | import com.dayu.baselibrary.tools.HexUtil; | 
 |  |  |  | 
 |  |  | import com.dayu.qiheonlinelibrary.utils.CardCommon; | 
 |  |  | import com.tencent.bugly.crashreport.CrashReport; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.util.Arrays; | 
 |  |  | import java.util.Calendar; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | 
 |  |  |  * Date: 2023-11-07 9:37 | 
 |  |  |  * Description: 齐河项目用户卡结构 | 
 |  |  |  */ | 
 |  |  | public class UserCard implements Serializable { | 
 |  |  | public class UserCard extends BaseUserCardCard implements Serializable { | 
 |  |  |     public String cardType = CardCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后  A2叠加充值 | 
 |  |  |  | 
 |  |  |     public int arerNumber;//区域号(底位在前高位在后) | 
 |  |  |  | 
 |  |  |     public int deviceNumberl;//设备编号(底位在前高位在后) | 
 |  |  |     public short rechargeTimes;//充值次数 | 
 |  |  |     public String userCode;//用户编号BCD省市县乡村 | 
 |  |  |  | 
 |  |  |     public int totalWater;//用户总用水量  底位在前,高位在后2位小数点  含两个小数点的整数 | 
 |  |  |     public int userCodeNumber;//用户编号(高位在前低位在后) | 
 |  |  |  | 
 |  |  |     public int totalElectric;//总用电量位 底位在前,高位在后  1位小数点  含1位小数点的整数 | 
 |  |  |     public int cardWriteState;//管理卡返写机制 00:中心写01:控制器返写 | 
 |  |  |  | 
 |  |  |     public int cardState;//现场卡状态  00:旧卡 01:新卡 | 
 |  |  |  | 
 |  |  |     public int balance;//剩余金额 底位在前  2位小数点,单位分 | 
 |  |  |  | 
 |  |  |     public int surplusWater;//剩余水量 底位在前  2位小数点 单位立方米 (跟价格一样先乘以100) | 
 |  |  |     public int surplusElecticity;//剩余电量 底位在前  2位小数点 单位立方米 (跟价格一样先乘以100) | 
 |  |  |  | 
 |  |  |     public int totalMorny;//累计充值金额 | 
 |  |  |  | 
 |  |  |     public Calendar rechargeDate;// 购水时间 BCD | 
 |  |  |  | 
 |  |  |     public Float electricPrice;//电单价,保留三位小数 | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 写卡完成后校验是否写卡成功 | 
 |  |  |      * | 
 |  |  |      * @param data | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public boolean equlsUserCard(List<byte[]> data) { | 
 |  |  |         // 参数验证 | 
 |  |  |         if (data == null || data.size() < 3) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         // 定义要比较的字节数组 | 
 |  |  |         byte[][] expectedBytes = {getZeroBytes(), getOneBytes(), getTwoBytes()}; | 
 |  |  |         // 逐个比较字节数组 | 
 |  |  |         for (int i = 0; i < 3; i++) { | 
 |  |  |             if (!Arrays.equals(data.get(i), expectedBytes[i])) { | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 返回完整的用户编号 | 
 |  |  |      * | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public String getMyUserCode() { | 
 |  |  |         return userCode + String.format("%04d", userCodeNumber); | 
 |  |  | //        return ""; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通过byte转bean | 
 |  |  |      * | 
 |  |  |      * @param data | 
 |  |  |      */ | 
 |  |  |     public static UserCard getBean(List<byte[]> data) { | 
 |  |  |     @Override | 
 |  |  |     public UserCard getBean(List<byte[]> data) { | 
 |  |  |         try { | 
 |  |  |             UserCard userCard = new UserCard(); | 
 |  |  |             //第0块解析 | 
 |  |  | 
 |  |  |  | 
 |  |  |             userCard.cardType = HexUtil.byteToHex(zero[0]); | 
 |  |  |  | 
 |  |  |             byte[] arerNumberByte = new byte[2]; | 
 |  |  |             byte[] arerNumberByte = new byte[4]; | 
 |  |  |             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); | 
 |  |  |  | 
 |  |  |             userCard.arerNumber = HexUtil.get16To10LowHightByBytes(arerNumberByte); | 
 |  |  |             byte[] userCodeByte = new byte[6]; | 
 |  |  |             System.arraycopy(zero, 5, userCodeByte, 0, userCodeByte.length); | 
 |  |  |             userCard.userCode = BcdUtil.bcdToStr(userCodeByte); | 
 |  |  |             byte[] userCodeNumber = new byte[2]; | 
 |  |  |             System.arraycopy(zero, 11, userCodeNumber, 0, userCodeNumber.length); | 
 |  |  |             userCard.userCodeNumber = HexUtil.get16To10LowHightByBytes(userCodeNumber); | 
 |  |  |             byte[] cardWriteState = new byte[1]; | 
 |  |  |             System.arraycopy(zero, 13, cardWriteState, 0, cardWriteState.length); | 
 |  |  |             userCard.cardWriteState = HexUtil.get16To10LowHightByBytes(cardWriteState); | 
 |  |  |             byte[] cardState = new byte[1]; | 
 |  |  |             System.arraycopy(zero, 14, cardState, 0, cardState.length); | 
 |  |  |             userCard.cardState = HexUtil.get16To10LowHightByBytes(cardState); | 
 |  |  |             //第1块解析 | 
 |  |  |             byte[] one = data.get(1); | 
 |  |  |             byte[] balanceByte = new byte[4]; | 
 |  |  |             System.arraycopy(one, 0, balanceByte, 0, balanceByte.length); | 
 |  |  |             userCard.balance =HexUtil.get16To10LowHightByBytes(balanceByte); | 
 |  |  |             userCard.balance = HexUtil.get16To10LowHightByBytes(balanceByte); | 
 |  |  |  | 
 |  |  |             byte[] surplusWaterByte = new byte[4]; | 
 |  |  |             System.arraycopy(one, 4, surplusWaterByte, 0, surplusWaterByte.length); | 
 |  |  |             userCard.surplusWater = HexUtil.get16To10LowHightByBytes(surplusWaterByte); | 
 |  |  |             userCard.surplusElecticity = HexUtil.get16To10LowHightByBytes(surplusWaterByte); | 
 |  |  |  | 
 |  |  |             byte[] totalMorny = new byte[4]; | 
 |  |  |             System.arraycopy(one, 8, totalMorny, 0, totalMorny.length); | 
 |  |  |             userCard.totalMorny = HexUtil.get16To10LowHightByBytes(totalMorny); | 
 |  |  |  | 
 |  |  |             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; | 
 |  |  |  | 
 |  |  |             byte[] two = data.get(2); | 
 |  |  |             byte[] electricPriceByte = new byte[4]; | 
 |  |  |             System.arraycopy(two, 8, electricPriceByte, 0, electricPriceByte.length); | 
 |  |  |             userCard.electricPrice = HexUtil.hexToFloatLowHigh(electricPriceByte); | 
 |  |  |  | 
 |  |  |             return userCard; | 
 |  |  |  | 
 |  |  | 
 |  |  |                 byte[] data = new byte[16]; | 
 |  |  |                 data[0] = HexUtil.hexToByte(cardType); | 
 |  |  |                 //区域号 | 
 |  |  |                 byte[] arerNumberBytes = new byte[2]; | 
 |  |  |                 byte[] arerNumberBytes = new byte[4]; | 
 |  |  |                 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[] userCodeBytes = new byte[6]; | 
 |  |  |                 byte[] userCodeDatas = BcdUtil.strToBcd(userCode); | 
 |  |  |                 System.arraycopy(userCodeDatas, 0, userCodeBytes, 0, userCodeDatas.length); | 
 |  |  |                 if (userCodeBytes != null) { | 
 |  |  |                     System.arraycopy(userCodeBytes, 0, data, 5, userCodeBytes.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); | 
 |  |  |                 //用户编号(自增) | 
 |  |  |                 byte[] userCodeNumberBytes = new byte[2]; | 
 |  |  |                 byte[] userCodeNumberDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(userCodeNumber)); | 
 |  |  |                 System.arraycopy(userCodeNumberDatas, 0, userCodeNumberBytes, 0, userCodeNumberDatas.length); | 
 |  |  |                 if (userCodeNumberBytes != null) { | 
 |  |  |                     System.arraycopy(userCodeNumberBytes, 0, data, 11, userCodeNumberBytes.length); | 
 |  |  |                 } | 
 |  |  |                 //管理卡返写机制 00:中心写01:控制器返写 | 
 |  |  |                 byte[] cardWriteStateBytes = new byte[1]; | 
 |  |  |                 byte[] cardWriteStateDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(cardWriteState)); | 
 |  |  |                 System.arraycopy(cardWriteStateDatas, 0, cardWriteStateBytes, 0, cardWriteStateDatas.length); | 
 |  |  |                 if (cardWriteStateBytes != null) { | 
 |  |  |                     System.arraycopy(cardWriteStateBytes, 0, data, 13, cardWriteStateBytes.length); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //管理卡返写机制 00:中心写01:控制器返写 | 
 |  |  |                 byte[] cardStateBytes = new byte[1]; | 
 |  |  |                 byte[] cardStateDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(cardState)); | 
 |  |  |                 System.arraycopy(cardStateDatas, 0, cardStateBytes, 0, cardStateDatas.length); | 
 |  |  |                 if (cardStateBytes != null) { | 
 |  |  |                     System.arraycopy(cardStateBytes, 0, data, 14, cardStateBytes.length); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 data[15] = getByteSum(data); | 
 |  |  |                 return data; | 
 |  |  |             } catch (Exception e) { | 
 |  |  | 
 |  |  |                     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); | 
 |  |  |                 byte[] surplusElecticityBytes = new byte[4]; | 
 |  |  |                 byte[] surplusElecticityDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusElecticity)); | 
 |  |  |                 System.arraycopy(surplusElecticityDatas, 0, surplusElecticityBytes, 0, surplusElecticityDatas.length); | 
 |  |  |                 if (surplusElecticityBytes != null) { | 
 |  |  |                     System.arraycopy(surplusElecticityBytes, 0, data, 4, surplusElecticityBytes.length); | 
 |  |  |                 } | 
 |  |  |                 byte[] totalMornyBytes = new byte[4]; | 
 |  |  |                 byte[] totalMornyDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalMorny)); | 
 |  |  |                 System.arraycopy(totalMornyDatas, 0, totalMornyBytes, 0, totalMornyDatas.length); | 
 |  |  |                 if (totalMornyBytes != null) { | 
 |  |  |                     System.arraycopy(totalMornyBytes, 0, data, 8, totalMornyBytes.length); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (rechargeDate != null) { | 
 |  |  | 
 |  |  |         public byte[] toBytes() { | 
 |  |  |             byte[] data = new byte[16]; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             try { | 
 |  |  |                 byte[] balanceBytes = new byte[4]; | 
 |  |  |                 byte[] balanceDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance)); | 
 |  |  | 
 |  |  |                     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); | 
 |  |  |                 byte[] surplusElecticityBytes = new byte[4]; | 
 |  |  |                 byte[] surplusElecticityDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusElecticity)); | 
 |  |  |                 System.arraycopy(surplusElecticityDatas, 0, surplusElecticityBytes, 0, surplusElecticityDatas.length); | 
 |  |  |                 if (surplusElecticityBytes != null) { | 
 |  |  |                     System.arraycopy(surplusElecticityBytes, 0, data, 4, surplusElecticityBytes.length); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 byte[] electricPriceBytes = new byte[4]; | 
 |  |  |                 byte[] electricPriceDatas = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(electricPrice)); | 
 |  |  |                 System.arraycopy(electricPriceDatas, 0, electricPriceBytes, 0, electricPriceDatas.length); | 
 |  |  |                 if (electricPriceBytes != null) { | 
 |  |  |                     System.arraycopy(electricPriceBytes, 0, data, 8, electricPriceBytes.length); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (rechargeDate != null) { | 
 |  |  | 
 |  |  |                     data[13] = bcdMonth; | 
 |  |  |                     data[14] = bcdDay; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 data[15] = getByteSum(data); | 
 |  |  |             } catch (Exception e) { | 
 |  |  | 
 |  |  |         this.arerNumber = arerNumber; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getDeviceNumberl() { | 
 |  |  |         return deviceNumberl; | 
 |  |  |     public String getUserCode() { | 
 |  |  |         return userCode; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDeviceNumberl(int deviceNumberl) { | 
 |  |  |         this.deviceNumberl = deviceNumberl; | 
 |  |  |     public void setUserCode(String userCode) { | 
 |  |  |         this.userCode = userCode; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public short getRechargeTimes() { | 
 |  |  |         return rechargeTimes; | 
 |  |  |     public int getUserCodeNumber() { | 
 |  |  |         return userCodeNumber; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setRechargeTimes(short rechargeTimes) { | 
 |  |  |         this.rechargeTimes = rechargeTimes; | 
 |  |  |     public void setUserCodeNumber(int userCodeNumber) { | 
 |  |  |         this.userCodeNumber = userCodeNumber; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getTotalWater() { | 
 |  |  |         return totalWater; | 
 |  |  |     public int getCardWriteState() { | 
 |  |  |         return cardWriteState; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setTotalWater(int totalWater) { | 
 |  |  |         this.totalWater = totalWater; | 
 |  |  |     public void setCardWriteState(int cardWriteState) { | 
 |  |  |         this.cardWriteState = cardWriteState; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getTotalElectric() { | 
 |  |  |         return totalElectric; | 
 |  |  |     public int getCardState() { | 
 |  |  |         return cardState; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setTotalElectric(int totalElectric) { | 
 |  |  |         this.totalElectric = totalElectric; | 
 |  |  |     public void setCardState(int cardState) { | 
 |  |  |         this.cardState = cardState; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getBalance() { | 
 |  |  | 
 |  |  |         this.balance = balance; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getSurplusWater() { | 
 |  |  |         return surplusWater; | 
 |  |  |     public int getSurplusElecticity() { | 
 |  |  |         return surplusElecticity; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setSurplusWater(int surplusWater) { | 
 |  |  |         this.surplusWater = surplusWater; | 
 |  |  |     public void setSurplusElecticity(int surplusElecticity) { | 
 |  |  |         this.surplusElecticity = surplusElecticity; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getTotalMorny() { | 
 |  |  |         return totalMorny; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setTotalMorny(int totalMorny) { | 
 |  |  |         this.totalMorny = totalMorny; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Calendar getRechargeDate() { | 
 |  |  | 
 |  |  |         this.rechargeDate = rechargeDate; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Float getElectricPrice() { | 
 |  |  |         return electricPrice; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setElectricPrice(Float electricPrice) { | 
 |  |  |         this.electricPrice = electricPrice; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |