package com.dayu.henanlibrary.card; 
 | 
  
 | 
import com.dayu.baselibrary.bean.BaseUserCardCard; 
 | 
import com.dayu.baselibrary.tools.BcdUtil; 
 | 
import com.dayu.baselibrary.tools.HexUtil; 
 | 
import com.dayu.henanlibrary.utils.CardCommon; 
 | 
  
 | 
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 UserCardHN extends BaseUserCardCard implements Serializable { 
 | 
    public String cardType = CardCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后  A2叠加充值 
 | 
  
 | 
    public int rechargeTimes;//充值次数 
 | 
  
 | 
    public int 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 读卡的数据 
 | 
     */ 
 | 
    @Override 
 | 
    public  UserCardHN getBean(List<byte[]> 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) { 
 | 
                    UserCardHN userCard = new UserCardHN(); 
 | 
                    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.hexToFloatLowHigh(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)); 
 | 
                    userCard.balance = HexUtil.get16To10LowHightByBytes(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.floatToHexLowHigh(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 int getSwipeNumber() { 
 | 
        return swipeNumber; 
 | 
    } 
 | 
  
 | 
    public void setSwipeNumber(int 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; 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |