左晓为主开发手持机充值管理机
zuoxiao
2024-09-27 feb7add1979c830e0d940286242a7c489f2f8f96
qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/card/UserCard.java
@@ -1,11 +1,13 @@
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;
@@ -15,31 +17,68 @@
 * 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块解析
@@ -47,44 +86,48 @@
            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;
@@ -105,37 +148,45 @@
                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) {
@@ -164,11 +215,17 @@
                    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) {
@@ -202,6 +259,7 @@
        public byte[] toBytes() {
            byte[] data = new byte[16];
            try {
                byte[] balanceBytes = new byte[4];
                byte[] balanceDatas = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance));
@@ -210,11 +268,18 @@
                    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) {
@@ -229,6 +294,7 @@
                    data[13] = bcdMonth;
                    data[14] = bcdDay;
                }
                data[15] = getByteSum(data);
            } catch (Exception e) {
@@ -271,36 +337,36 @@
        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() {
@@ -311,12 +377,20 @@
        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() {
@@ -327,5 +401,13 @@
        this.rechargeDate = rechargeDate;
    }
    public Float getElectricPrice() {
        return electricPrice;
    }
    public void setElectricPrice(Float electricPrice) {
        this.electricPrice = electricPrice;
    }
}