左晓为主开发手持机充值管理机
zuoxiao
2024-06-13 d1573513f0eada6a915c2163ce6c84451c8c1070
1.修复河南版本域名卡结构不同问题
2.修复齐河版本最终购水日期的bug
10个文件已修改
2个文件已添加
563 ■■■■ 已修改文件
app/build.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
baselibrary/src/main/java/com/dayu/baselibrary/tools/HexUtil.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/NFCWreatActivity.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/PassWordActivity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/ReadCardAcitivy.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/SysActivity.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/card/DomainCard.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/dbBean/DomainBean.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/java/com/dayu/henanlibrary/view/DomaindDialog.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
henanlibrary/src/main/res/layout/domain_dialog.xml 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qihealonelibrary/src/main/java/com/dayu/qihealonelibrary/activity/PassWordActivity.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qihealonelibrary/src/main/java/com/dayu/qihealonelibrary/card/UserCard.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -16,8 +16,8 @@
        applicationId "com.dayu.recharge"
        minSdk 23
        targetSdk 26
        versionCode 22
        versionName "2.2"
        versionCode 24
        versionName "2.4"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//        ndk {
baselibrary/src/main/java/com/dayu/baselibrary/tools/HexUtil.java
@@ -58,6 +58,29 @@
        return ((data & 0xF0) >> 4) * 10 + ((data & 0x0F));
    }
    public static byte[] getIntToBCD(int number) {
        // 获取整数的字符串表示形式
        String numberStr = Integer.toString(number);
        // 创建一个字节数组以存储BCD表示
        int len = numberStr.length();
        byte[] bcd = new byte[(len + 1) / 2];
        int j = 0;
        // 如果数字的长度是奇数,需要在前面添加一个0
        if (len % 2 != 0) {
            numberStr = "0" + numberStr; // 先添加前导零
            len++;
        }
        // 将每一对数字转换为一个字节
        for (int i = 0; i < len; i += 2) {
            bcd[j++] = (byte) (((numberStr.charAt(i) - '0') << 4) | (numberStr.charAt(i + 1) - '0'));
        }
        return bcd;
    }
    /**
     * short10进制转16进制 低位在前高位在后
     *
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/NFCWreatActivity.java
@@ -204,9 +204,13 @@
                cleanUserCard = (CleanUserCard) this.getIntent().getSerializableExtra("cleanUserCard");
                binding.cardData.setText("制作删除全部用户卡");
            }
            if (this.getIntent().hasExtra("domainCard")) {
                domainCard = (DomainCard) this.getIntent().getSerializableExtra("domainCard");
                binding.cardData.setText("制作设置域名卡");
            if (this.getIntent().hasExtra("domainCard_xinxiang")) {
                domainCard = (DomainCard) this.getIntent().getSerializableExtra("domainCard_xinxiang");
                binding.cardData.setText("制作设置新乡域名卡");
            }
            if (this.getIntent().hasExtra("domainCard_luyi")) {
                domainCard = (DomainCard) this.getIntent().getSerializableExtra("domainCard_luyi");
                binding.cardData.setText("制作设置新乡域名卡");
            }
            if (this.getIntent().hasExtra("testCard")) {
                testCard = (TestCard) this.getIntent().getSerializableExtra("testCard");
@@ -558,19 +562,19 @@
     * 设置域名卡
     *
     * @param intent
     * @param domainCard
     * @param domainXinXiangCard
     */
    private void setDomainCard(Intent intent, DomainCard domainCard) {
    private void setDomainCard(Intent intent, DomainCard domainXinXiangCard) {
        try {
            domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainCard.getZeroByte(), 1, 0);
            domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainXinXiangCard.getZeroByte(), 1, 0);
            if (!domainCrdFlag) {
                return;
            }
            domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainCard.getOneByte(), 1, 1);
            domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainXinXiangCard.getOneByte(), 1, 1);
            if (!domainCrdFlag) {
                return;
            }
            domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainCard.getTwoByte(), 1, 2);
            domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainXinXiangCard.getTwoByte(), 1, 2);
        } catch (Exception e) {
            domainCrdFlag = false;
            throw new RuntimeException(e);
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/PassWordActivity.java
@@ -32,8 +32,8 @@
                if (!TextUtils.isEmpty(pswBinding.pswNew.getText().toString()) && !TextUtils.isEmpty(pswBinding.pswOld.getText().toString()) && !TextUtils.isEmpty(pswBinding.pswNewAgin.getText().toString())) {
                    if ((passWordBean != null
                            && (passWordBean.getPassWord().equalsIgnoreCase(WSMD5.getMD5Str(pswBinding.pswOld.getText().toString())))
                            || (WSMD5.getMD5Str(pswBinding.pswOld.getText().toString()).equals("8af357996269a1b52b182a839150097d"))&& passWordBean == null)) {
                            && (passWordBean.getPassWord().equalsIgnoreCase(WSMD5.getMD5Str(pswBinding.pswOld.getText().toString()))))
                            || (WSMD5.getMD5Str(pswBinding.pswOld.getText().toString()).equals("e10adc3949ba59abbe56e057f20f883e") && passWordBean == null)) {
                        if (passWordBean == null) {
                            passWordBean = new PassWordBean();
                        }
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/ReadCardAcitivy.java
@@ -131,9 +131,20 @@
                                    break;
                                case CardCommon.DOMAIN_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为设置域名卡");
                                    DomainCard domainCard = DomainCard.toBean(data);
                                    redCardBinding.readCardDataTV.setText("序号:" + domainCard.getDomainNumber() + "\n" + "域名:" + domainCard.getDomainName() + "\n" + "端口号:" + domainCard.getPort());
                                    DomainCard domainXinXiangCard = DomainCard.toBean(data);
                                    if(domainXinXiangCard.getType()==0){
                                        redCardBinding.readCardTypeTV.setText("当前为新乡域名卡");
                                    }else {
                                        redCardBinding.readCardTypeTV.setText("当前为鹿邑域名卡");
                                    }
                                    StringBuilder builder = new StringBuilder();
                                    if (domainXinXiangCard.getType() == 0) {
                                        builder.append("序号:" + domainXinXiangCard.getDomainNumber() + "\n");
                                    }
                                    builder.append("域名:" + domainXinXiangCard.getDomainName());
                                    builder.append("\n" + "端口号:" + domainXinXiangCard.getPort());
                                    redCardBinding.readCardDataTV.setText(builder.toString());
                                    stopAnim();
                                    break;
                                case CardCommon.TEST_CARD_TYPE:
henanlibrary/src/main/java/com/dayu/henanlibrary/activity/SysActivity.java
@@ -9,13 +9,12 @@
import com.dayu.henanlibrary.card.CleanUserCard;
import com.dayu.henanlibrary.card.ConfigurationPowerCard;
import com.dayu.henanlibrary.card.ConfigureDeviceRegistrationCrad;
import com.dayu.henanlibrary.card.DomainCard;
import com.dayu.henanlibrary.card.ManageCard;
import com.dayu.henanlibrary.card.RegisteredCard;
import com.dayu.henanlibrary.card.TestCard;
import com.dayu.henanlibrary.databinding.ActivityAdminHnBinding;
import com.dayu.henanlibrary.dbBean.DomainBean;
import com.dayu.henanlibrary.dbBean.PowerBean;
import com.dayu.henanlibrary.view.DomaindDialog;
/**
 * Copyright (C), 2023,
@@ -69,20 +68,8 @@
        });
//        设置域名卡
        adminBinding.adminDomain.setOnClickListener(v -> {
            Intent intent = new Intent(SysActivity.this, NFCWreatActivity.class);
            DomainBean domainBean = baseDao.domainPortDao().findFirst();
            DomainCard domainCard = new DomainCard();
            if (domainBean != null) {
                domainCard.setDomainNumber(domainBean.getDomainNumber());
                domainCard.setDomainName(domainBean.getDomain());
                domainCard.setPort(domainBean.getPort());
            } else {
                domainCard.setDomainNumber("1");
                domainCard.setDomainName("newreceive.hnsjgg.com");
                domainCard.setPort(9999);
            }
            intent.putExtra("domainCard", domainCard);
            startActivity(intent);
            DomaindDialog domaindDialog=new DomaindDialog(SysActivity.this);
            domaindDialog.show();
        });
        adminBinding.adminTest.setOnClickListener(v -> {
            Intent intent = new Intent(SysActivity.this, NFCWreatActivity.class);
henanlibrary/src/main/java/com/dayu/henanlibrary/card/DomainCard.java
@@ -1,5 +1,7 @@
package com.dayu.henanlibrary.card;
import android.text.TextUtils;
import com.dayu.baselibrary.tools.BcdUtil;
import com.dayu.baselibrary.tools.HexUtil;
import com.dayu.henanlibrary.utils.CardCommon;
@@ -26,6 +28,16 @@
    //端口号为5个字节,不足5位高位补0。端口号与域名之间用”,”隔开。端口号最后以”#”结束
    public String domainName;//域名
    public int port;//端口
    public int type;//域名卡新乡C1后有01==0,鹿邑没有01==1
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public String getDomainName() {
        return domainName;
@@ -71,34 +83,80 @@
    public static DomainCard toBean(List<byte[]> data) {
        try {
            DomainCard domainCard = new DomainCard();
            DomainCard domainXinXiangCard = new DomainCard();
            String domainNumber = BcdUtil.bcdToStr(data.get(0)[1]);
            domainCard.domainNumber = domainNumber;
            int domainLength = HexUtil.get16to10(HexUtil.byteToHex(data.get(0)[2]));
            byte[] domainData = new byte[domainLength + 7];
            int index = 0;
            for (int i = 0; i < 3; i++) {
                int jIndex;
                if (i == 0) {
                    jIndex = 3;
                } else {
                    jIndex = 0;
                }
                for (int j = jIndex; j < 15; j++) {
                    if (index < domainData.length) {
                        domainData[index] = data.get(i)[j];
                        index++;
            if ("00".equals(domainNumber)||"01".equals(domainNumber)||"02".equals(domainNumber)){//假如序号小于等于2就认为是新乡的
                domainXinXiangCard.setType(0);
                domainXinXiangCard.domainNumber = domainNumber;
                int domainLength = HexUtil.get16to10(HexUtil.byteToHex(data.get(0)[2]));
                byte[] domainData = new byte[domainLength + 7];
                int index = 0;
                for (int i = 0; i < 3; i++) {
                    int jIndex;
                    if (i == 0) {
                        jIndex = 3;
                    } else {
                        jIndex = 0;
                    }
                    for (int j = jIndex; j < 15; j++) {
                        if (index < domainData.length) {
                            domainData[index] = data.get(i)[j];
                            index++;
                        }
                    }
                }
                String domainStr = new String(domainData, StandardCharsets.US_ASCII);
                if (!TextUtils.isEmpty(domainStr)){
                    try {
                        String[] parts = domainStr.split("#")[0].split(",");
                        if (parts.length >= 2) {
                            String domainName = parts[0];
                            String port = parts[1].replace("#", "");
                            domainXinXiangCard.setDomainName(domainName);
                            domainXinXiangCard.setPort(Integer.valueOf(port));
                        }
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }
                }
            }else {
                domainXinXiangCard.setType(1);
                int domainLength = HexUtil.get16to10(HexUtil.byteToHex(data.get(0)[1]));
                byte[] domainData = new byte[domainLength + 7];
                int index = 0;
                for (int i = 0; i < 3; i++) {
                    int jIndex;
                    if (i == 0) {
                        jIndex = 2;
                    } else {
                        jIndex = 0;
                    }
                    for (int j = jIndex; j < 15; j++) {
                        if (index < domainData.length) {
                            domainData[index] = data.get(i)[j];
                            index++;
                        }
                    }
                }
                String domainStr = new String(domainData, StandardCharsets.US_ASCII);
                if (!TextUtils.isEmpty(domainStr)){
                    try {
                        String[] parts = domainStr.split("#")[0].split(",");
                        if (parts.length >= 2) {
                            String domainName = parts[0];
                            String port = parts[1].replace("#", "");
                            domainXinXiangCard.setDomainName(domainName);
                            domainXinXiangCard.setPort(Integer.valueOf(port));
                        }
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }
                }
            }
            String domainStr = new String(domainData, StandardCharsets.US_ASCII);
            String domainName = domainStr.split(",")[0];
            String port = domainStr.split(",")[1].replace("#", "");
            domainCard.setDomainName(domainName);
            domainCard.setPort(Integer.valueOf(port));
            return domainCard;
            return domainXinXiangCard;
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
@@ -114,24 +172,45 @@
        public byte[] toByte() {
            byte[] data = new byte[16];
            data[0] = HexUtil.hexToByte(cardType);
            if (domainNumber != null) {
                byte[] domainNumbers = BcdUtil.strToBcd(domainNumber);
                data[1] = domainNumbers[0];
            }
            domainLength = domainName.length();
            data[2] = HexUtil.hexToByte(HexUtil.get10to16(domainLength));
            String portStr = String.valueOf(port);
            int lenght = portStr.length();
            for (int i = 0; i < 5 - lenght; i++) {
                portStr = "0" + portStr;
            }
            String ascii = IDN.toASCII(domainName + "," + portStr + "#");
            asciiByte = ascii.getBytes();
            if (asciiByte.length < 12) {
                System.arraycopy(asciiByte, 0, data, 3, asciiByte.length);
//            域名卡新乡C1后有01==0,鹿邑没有01==1
            if (type == 0) {
                if (domainNumber != null) {
                    byte[] domainNumbers = BcdUtil.strToBcd(domainNumber);
                    data[1] = domainNumbers[0];
                }
                domainLength = domainName.length();
                data[2] = HexUtil.hexToByte(HexUtil.get10to16(domainLength));
                String portStr = String.valueOf(port);
                int lenght = portStr.length();
                for (int i = 0; i < 5 - lenght; i++) {
                    portStr = "0" + portStr;
                }
                String ascii = IDN.toASCII(domainName + "," + portStr + "#");
                asciiByte = ascii.getBytes();
                if (asciiByte.length < 12) {
                    System.arraycopy(asciiByte, 0, data, 3, asciiByte.length);
                } else {
                    System.arraycopy(asciiByte, 0, data, 3, 12);
                }
            } else {
                System.arraycopy(asciiByte, 0, data, 3, 12);
                data[1] = HexUtil.hexToByte(HexUtil.get10to16(domainLength));
                String portStr = String.valueOf(port);
                int lenght = portStr.length();
                for (int i = 0; i < 5 - lenght; i++) {
                    portStr = "0" + portStr;
                }
                String ascii = IDN.toASCII(domainName + "," + portStr + "#");
                asciiByte = ascii.getBytes();
                if (asciiByte.length < 13) {
                    System.arraycopy(asciiByte, 0, data, 1, asciiByte.length);
                } else {
                    System.arraycopy(asciiByte, 0, data, 1, 13);
                }
            }
            data[15] = getByteSum(data);
            return data;
        }
@@ -145,13 +224,24 @@
        public byte[] toBytes() {
            byte[] data = new byte[16];
            if (asciiByte.length > 12) {
                if (asciiByte.length - 12 < 15) {
                    System.arraycopy(asciiByte, 12, data, 0, asciiByte.length - 12);
                } else {
                    System.arraycopy(asciiByte, 12, data, 0, 15);
            if (type==0){
                if (asciiByte.length > 12) {
                    if (asciiByte.length - 12 < 15) {
                        System.arraycopy(asciiByte, 12, data, 0, asciiByte.length - 12);
                    } else {
                        System.arraycopy(asciiByte, 12, data, 0, 15);
                    }
                }
            }else {
                if (asciiByte.length > 13) {
                    if (asciiByte.length - 13 < 15) {
                        System.arraycopy(asciiByte, 13, data, 0, asciiByte.length - 12);
                    } else {
                        System.arraycopy(asciiByte, 13, data, 0, 15);
                    }
                }
            }
            data[15] = getByteSum(data);
            return data;
        }
@@ -165,13 +255,24 @@
    public class Two extends BaseCard {
        public byte[] toBytes() {
            byte[] data = new byte[16];
            if (asciiByte.length > (12 + 15)) {
                if (asciiByte.length - (12 + 15) < 15) {
                    System.arraycopy(asciiByte, 12, data, 0, asciiByte.length - (12 + 15));
                } else {
                    System.arraycopy(asciiByte, 12, data, 0, 15);
            if (type==0){
                if (asciiByte.length > (12 + 15)) {
                    if (asciiByte.length - (12 + 15) < 15) {
                        System.arraycopy(asciiByte, 12 + 15, data, 0, asciiByte.length - (12 + 15));
                    } else {
                        System.arraycopy(asciiByte, 12 + 15, data, 0, 15);
                    }
                }
            }else {
                if (asciiByte.length > (13 + 15)) {
                    if (asciiByte.length - (13 + 15) < 15) {
                        System.arraycopy(asciiByte, 13 + 15, data, 0, asciiByte.length - (12 + 15));
                    } else {
                        System.arraycopy(asciiByte, 13 + 15, data, 0, 15);
                    }
                }
            }
            data[15] = getByteSum(data);
            return data;
        }
henanlibrary/src/main/java/com/dayu/henanlibrary/dbBean/DomainBean.java
@@ -3,6 +3,8 @@
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import java.io.Serializable;
/**
 * Created by Android Studio.
 * author: zuo
@@ -11,7 +13,7 @@
 * 备注: 域名和端口号相关
 */
@Entity
public class DomainBean {
public class DomainBean implements Serializable {
    @PrimaryKey(autoGenerate = true)
    public long id;
henanlibrary/src/main/java/com/dayu/henanlibrary/view/DomaindDialog.java
New file
@@ -0,0 +1,108 @@
package com.dayu.henanlibrary.view;
import static android.view.Gravity.CENTER;
import android.app.Dialog;
import android.content.Intent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.RadioGroup;
import android.widget.TextView;
import com.dayu.baselibrary.utils.ToastUtil;
import com.dayu.henanlibrary.R;
import com.dayu.henanlibrary.activity.HNBaseActivity;
import com.dayu.henanlibrary.activity.NFCWreatActivity;
import com.dayu.henanlibrary.card.DomainCard;
import com.dayu.henanlibrary.dbBean.DomainBean;
/**
 * author: zuo
 * Date: 2024-06-07
 * Time: 10:44
 * 备注:选择域名卡类型 域名卡新乡C1后有01,鹿邑没有01,卡结构不同
 */
public class DomaindDialog extends Dialog {
    HNBaseActivity mContext;
    boolean ischose = false;
    int type;
    public DomaindDialog(HNBaseActivity context) {
        super(context, com.dayu.baselibrary.R.style.ws_pay_showSelfDialog);
        mContext = context;
        initView();
    }
    private void initView() {
        getWindow().setGravity(CENTER);
        setContentView(R.layout.domain_dialog);
        setCanceledOnTouchOutside(false);
        RadioGroup radioGroup = findViewById(R.id.radioLibrary);
        radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
            ischose = true;
            // 当选中的RadioButton发生变化时调用
            if (checkedId == R.id.xinxiang) {
                type = 0;
            } else if (checkedId == R.id.luyi) {// 处理选中Option 2的逻辑
                type = 1;
            }
        });
        TextView okBtn = findViewById(R.id.ok);
        okBtn.setOnClickListener(v -> {
            if (ischose) {
                Intent intent = new Intent(mContext, NFCWreatActivity.class);
                DomainBean domainBean = mContext.baseDao.domainPortDao().findFirst();
                DomainCard domainCard = new DomainCard();
                if (domainBean != null) {
                    domainCard.setDomainNumber(domainBean.getDomainNumber());
                    domainCard.setDomainName(domainBean.getDomain());
                    domainCard.setPort(domainBean.getPort());
                } else {
                    ToastUtil.showLong("当前未设置域名信息,已使用河南省平台默认域名与端口号");
                    domainCard.setDomainNumber("1");
                    domainCard.setDomainName("newreceive.hnsjgg.com");
                    domainCard.setPort(9999);
                }
                //域名卡新乡C1后有01,鹿邑没有01
                if (type == 0) {
                    domainCard.setType(0);
                    intent.putExtra("domainCard_xinxiang", domainCard);
                } else {
                    domainCard.setType(1);
                    intent.putExtra("domainCard_luyi", domainCard);
                }
                mContext.startActivity(intent);
                DomaindDialog.this.dismiss();
            }
        });
    }
    @Override
    public void show() {
        super.show();
        /**
         * 设置宽度全屏,要设置在show的后面
         */
        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
        layoutParams.gravity = CENTER;
        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
        getWindow().getDecorView().setPadding(0, 0, 0, 0);
        getWindow().setAttributes(layoutParams);
    }
    public interface libraryBack {
        void listener(int type);
    }
}
henanlibrary/src/main/res/layout/domain_dialog.xml
New file
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#40000000"
    android:gravity="center"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/dialog_bg_margin"
        android:background="@drawable/base_bg_dialog_top_stroke"
        android:gravity="center"
        android:orientation="vertical">
        <TextView
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="选择域名卡类型"
            android:textColor="@color/dialog_btn"
            android:textSize="23sp"
            android:textStyle="bold" />
        <View
            android:layout_width="match_parent"
            android:layout_height="2px"
            android:layout_marginTop="20dp"
            android:background="@color/line_bg" />
        <RadioGroup
            android:id="@+id/radioLibrary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <RadioButton
                android:id="@+id/xinxiang"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:layout_marginTop="25dp"
                android:layout_marginRight="50dp"
                android:background="@drawable/radio_select"
                android:button="@null"
                android:gravity="center"
                android:padding="6dp"
                android:text="新乡域名卡"
                android:textColor="@drawable/radio_text_select"
                android:textSize="20sp" />
            <RadioButton
                android:id="@+id/luyi"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:layout_marginTop="25dp"
                android:layout_marginRight="50dp"
                android:background="@drawable/radio_select"
                android:button="@null"
                android:gravity="center"
                android:padding="6dp"
                android:text="鹿邑域名卡"
                android:textColor="@drawable/radio_text_select"
                android:textSize="20sp" />
        </RadioGroup>
        <View
            android:layout_width="match_parent"
            android:layout_height="2px"
            android:layout_marginTop="35dp"
            android:background="@color/line_bg" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:padding="5dp"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/ok"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dialog_btn_height"
                android:background="@drawable/textview_select_bg"
                android:gravity="center"
                android:paddingLeft="15dp"
                android:paddingTop="5dp"
                android:paddingRight="15dp"
                android:paddingBottom="5dp"
                android:text="确      认"
                android:textColor="@color/dialog_btn"
                android:textSize="20sp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
qihealonelibrary/src/main/java/com/dayu/qihealonelibrary/activity/PassWordActivity.java
@@ -28,40 +28,37 @@
        super.onCreate(savedInstanceState);
        pswBinding = ActivityPswQhaBinding.inflate(LayoutInflater.from(this));
        setContentView(pswBinding.getRoot());
        pswBinding.waterOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    passWordBean = baseBaseDao.loginPsDao().findFirst();
        pswBinding.waterOk.setOnClickListener(v -> {
            try {
                passWordBean = baseBaseDao.loginPsDao().findFirst();
                    if (!TextUtils.isEmpty(pswBinding.pswNew.getText().toString()) && !TextUtils.isEmpty(pswBinding.pswOld.getText().toString()) && !TextUtils.isEmpty(pswBinding.pswNewAgin.getText().toString())) {
                        if ((passWordBean != null
                                && (passWordBean.getPassWord().equalsIgnoreCase(WSMD5.getMD5Str(pswBinding.pswOld.getText().toString())))
                                || (WSMD5.getMD5Str(pswBinding.pswOld.getText().toString()).equals("8af357996269a1b52b182a839150097d"))&& passWordBean == null)) {
                            if (passWordBean == null) {
                                passWordBean = new PassWordBean();
                            }
                            if (pswBinding.pswNew.getText().toString().equals(pswBinding.pswNewAgin.getText().toString())) {
                                passWordBean.setPassWord(pswBinding.pswNewAgin.getText().toString());
                                baseBaseDao.loginPsDao().insert(passWordBean);
                                TipUtil.show(PassWordActivity.this, "密码修改完成", () -> {
                                    PassWordActivity.this.finish();
                                });
                if (!TextUtils.isEmpty(pswBinding.pswNew.getText().toString()) && !TextUtils.isEmpty(pswBinding.pswOld.getText().toString()) && !TextUtils.isEmpty(pswBinding.pswNewAgin.getText().toString())) {
                    if  ((passWordBean != null
                            && (passWordBean.getPassWord().equalsIgnoreCase(WSMD5.getMD5Str(pswBinding.pswOld.getText().toString()))))
                            || (WSMD5.getMD5Str(pswBinding.pswOld.getText().toString()).equals("e10adc3949ba59abbe56e057f20f883e") && passWordBean == null)) {
                        if (passWordBean == null) {
                            passWordBean = new PassWordBean();
                        }
                        if (pswBinding.pswNew.getText().toString().equals(pswBinding.pswNewAgin.getText().toString())) {
                            passWordBean.setPassWord(pswBinding.pswNewAgin.getText().toString());
                            baseBaseDao.loginPsDao().insert(passWordBean);
                            TipUtil.show(PassWordActivity.this, "密码修改完成", () -> {
                                PassWordActivity.this.finish();
                            });
                            } else {
                                TipUtil.show(PassWordActivity.this, "两次输入的密码不一致");
                            }
                        } else {
                            TipUtil.show(PassWordActivity.this, "旧密码输入错误");
                            TipUtil.show(PassWordActivity.this, "两次输入的密码不一致");
                        }
                    } else {
                        TipUtil.show(PassWordActivity.this, "请输完内容");
                        TipUtil.show(PassWordActivity.this, "旧密码输入错误");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } else {
                    TipUtil.show(PassWordActivity.this, "请输完内容");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
qihealonelibrary/src/main/java/com/dayu/qihealonelibrary/card/UserCard.java
@@ -175,9 +175,9 @@
                    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 = (byte) ((year / 10) << 4 | ((year % 10) / 100));
                    byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
                    byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
                    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;
@@ -221,9 +221,9 @@
                    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 = (byte) ((year / 10) << 4 | ((year % 10) / 100));
                    byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
                    byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
                    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;