左晓为主开发手持机充值管理机
zuoxiao
2023-11-22 1ffa3cb19f95855d44fbc9485f4eb3286b12e359
修改提示方式
修改充值流程
33个文件已修改
6个文件已添加
1638 ■■■■ 已修改文件
app/src/main/AndroidManifest.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/MyApplication.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/AdminSetupActivity.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/DomainActivity.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/ElectricPriceActivity.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/HomeActivity.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/IdentifyingActivity.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/MyActivity.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java 417 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/PassWordActivity.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/PowerActivity.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeDetail.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/SysActivity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/dbBean/RechargeBean.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/net/SocketNet.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/utils/TipUtil.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/utils/ToastUtil.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/view/EdtDialog.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/view/PassWordDialog.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/view/TipDialog.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_admin_setup.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_home.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_my.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_new_card.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_recharge.xml 157 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_recharge_detail.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_red_card.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/text_dialog.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/colors.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -78,7 +78,14 @@
        <activity android:name=".activity.PassWordActivity" />
        <activity android:name=".activity.MyActivity" />
        <activity android:name=".activity.RechargeActivity" />
        <activity
            android:name=".activity.RechargeActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activity.ReadCardAcitivy"
@@ -106,7 +113,8 @@
        <activity android:name=".activity.DomainActivity" />
        <activity android:name=".activity.ElectricPriceActivity" />
        <activity android:name=".activity.IdentifyingActivity" />
        <activity android:name=".activity.ReplacementActivity"/>
        <activity android:name=".activity.ReplacementActivity" />
        <activity android:name=".activity.RechargeDetail" />
        <meta-data
app/src/main/java/com/dayu/recharge/MyApplication.java
@@ -9,9 +9,9 @@
import com.dayu.recharge.dao.BaseDaoSingleton;
import com.dayu.recharge.dbBean.DeviceNumber;
import com.dayu.recharge.dbBean.IpBean;
import com.dayu.recharge.utils.ToastUtil;
import com.easysocket.EasySocket;
import com.easysocket.config.EasySocketOptions;
import com.easysocket.connection.action.SocketStatus;
import com.easysocket.entity.SocketAddress;
import com.tencent.bugly.crashreport.CrashReport;
import com.dayu.recharge.net.ScoketMessageProtocol;
@@ -26,8 +26,7 @@
import com.dayu.recharge.utils.AidlUtil;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import java.util.Arrays;
@@ -100,7 +99,7 @@
                                    createSocket(msg.obj + "", ipBean.getPort());
                                    break;
                                case 2:
                                    ToastUtil.show(MyApplication.this, "DNS解析失败");
                                    ToastUtil.show("DNS解析失败");
                                    break;
                            }
@@ -186,14 +185,14 @@
                                            BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().insert(deviceNumber);
//                                            WSHelper.getInstance(MyApplication.this).put("initCode", initCode);
                                            ToastUtil.show(MyApplication.this, "充值管理注册报文获取成功");
                                            ToastUtil.show("充值管理注册报文获取成功");
                                        } else {
                                            //校验CRC错误
                                            ToastUtil.show(MyApplication.this, "确认收到注册报文状态失败");
                                            ToastUtil.show("确认收到注册报文状态失败");
                                        }
                                    } else {
                                        //校验CRC错误
                                        ToastUtil.show(MyApplication.this, "确认收到注册报文校验CRC错误");
                                        ToastUtil.show("确认收到注册报文校验CRC错误");
                                    }
                                }
@@ -203,7 +202,7 @@
                                }
                            });
                        } else {//校验CRC错误
                            ToastUtil.show(MyApplication.this, "充值管理注册报文校验CRC错误");
                            ToastUtil.show("充值管理注册报文校验CRC错误");
                        }
                    }
app/src/main/java/com/dayu/recharge/activity/AdminSetupActivity.java
@@ -12,7 +12,7 @@
import com.dayu.recharge.databinding.ActivityAdminSetupBinding;
import com.dayu.recharge.dbBean.AdminDataBean;
import com.dayu.recharge.dbBean.IpBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.example.pickerviewlibrary.picker.TeaPickerView;
import com.example.pickerviewlibrary.picker.entity.PickerData;
import com.example.pickerviewlibrary.picker.listener.OnPickerClickListener;
@@ -54,19 +54,21 @@
        adminBinding.setupOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!TextUtils.isEmpty(adminBinding.adminName.getText().toString())
                        && !TextUtils.isEmpty(adminBinding.adminPhone.getText().toString())
                        && !TextUtils.isEmpty(adminData.getCun())
                if (!TextUtils.isEmpty(adminData.getCun())
                        && !TextUtils.isEmpty(adminBinding.adminSerial.getText().toString())
                ) {
                    if (Integer.valueOf(adminBinding.adminSerial.getText().toString()) <= 16777215) {
                        adminData.setName(adminBinding.adminName.getText().toString());
                        adminData.setPhone(adminBinding.adminPhone.getText().toString());
                        adminBinding.adminAddressCode.setText(adminData.getAddressCode());
                        adminData.setSerial(adminBinding.adminSerial.getText().toString());
                        baseDao.adminDao().insert(adminData);
                        MyApplication.myApplication.initEasySocket(false, null);
                        ToastUtil.show(AdminSetupActivity.this, "设置成功");
                        TipUtil.show(AdminSetupActivity.this, "设置成功", new TipUtil.TipListener() {
                            @Override
                            public void onCancle() {
                                AdminSetupActivity.this.finish();
                            }
                        });
                        setData();
                        IpBean ipBean = baseDao.ipDao().findFirst();
                        if (ipBean != null) {
@@ -74,10 +76,10 @@
                        }
                    } else {
                        ToastUtil.show(AdminSetupActivity.this, "输入的数字不能超过16777215");
                        TipUtil.show(AdminSetupActivity.this, "输入的数字不能超过16777215");
                    }
                } else {
                    ToastUtil.show(AdminSetupActivity.this, "请输入完整内容");
                    TipUtil.show(AdminSetupActivity.this, "请输入完整内容");
                }
            }
        });
@@ -108,8 +110,7 @@
            if (adminData != null) {
                this.adminData = adminData;
                adminBinding.adminSerial.setText(adminData.getSerial());
                adminBinding.adminPhone.setText(adminData.getPhone());
                adminBinding.adminName.setText(adminData.getName());
                adminBinding.adminAddressCode.setText(adminData.getAddressCode());
                adminBinding.adminAddress.setText(adminData.getSheng() + adminData.getShi() + adminData.getXian() + adminData.getZhen() + adminData.getCun());
            } else {
                adminBinding.adminSerial.setText("12" + generateUniqueNumber(getSN()));
@@ -151,6 +152,7 @@
                        adminData.setAddressCode(pickerData.getSecondText().getCode());
                    }
                    adminBinding.adminAddress.setText(adminData.getSheng() + adminData.getShi() + adminData.getXian() + adminData.getZhen() + adminData.getCun());
                    adminBinding.adminAddressCode.setText(adminData.getAddressCode());
                    pickerView.dismiss();
                }
            });
app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java
@@ -9,8 +9,16 @@
import android.content.Context;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Handler;
import android.os.Message;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.tools.NfcReadHelper;
import com.dayu.recharge.utils.TipUtil;
import com.tencent.bugly.crashreport.CrashReport;
import java.util.List;
import java.util.Map;
/**
 * Author:Created by Ricky on 2017/8/25.
@@ -22,8 +30,27 @@
 * 将NFC标签卡靠近手机后部(NFC标签卡可网上自行购买)
 */
public class BaseNfcActivity extends BaseActivity {
    /**
     * 该卡已写入用户信息
     */
    public final static int HAS_USER = 1;
    /**
     * 该卡未写入用户信息
     */
    public final static int NO_USER = 2;
    /**
     * 充值
     */
    public final static int RECHARGE = 3;
    public final static int ERROR = -1;
    protected NfcAdapter mNfcAdapter;
    private PendingIntent mPendingIntent;
    volatile UserCard userCard;
    Handler handler;
    /**
     * onCreat->onStart->onResume->onPause->onStop->onDestroy
@@ -71,13 +98,51 @@
     */
    protected Boolean ifNFCUse(Context context) {
        if (mNfcAdapter == null) {
            ToastUtil.show(context, "设备不支持NFC!");
            TipUtil.show(context, "设备不支持NFC!");
            return false;
        }
        if (mNfcAdapter != null && !mNfcAdapter.isEnabled()) {
            ToastUtil.show(context, "请在系统设置中先启用NFC功能!");
            TipUtil.show(context, "请在系统设置中先启用NFC功能!");
            return false;
        }
        return true;
    }
    /**
     * 读取全部数据
     */
    public void readAllData(Intent intent) {
        try {
            NfcReadHelper.getInstence(intent)
                    .getAllData(new NfcReadHelper.NFCCallListback() {
                        @Override
                        public void callBack(Map<String, List<byte[]>> data) {
                            Message message = new Message();
//                           获取1扇区数据
                            List<byte[]> oneSector = data.get("1");
                            if (oneSector != null && oneSector.size() > 0) {
                                userCard = UserCard.getBean(oneSector);
                                message.what = RECHARGE;
                            } else {
                                message.what = ERROR;
                            }
                            if (handler != null) {
                                handler.sendMessage(message);
                            }
                        }
                        @Override
                        public void error(int code) {
                            if (handler != null) {
                                Message message = new Message();
                                message.what = ERROR;
                                handler.sendMessage(message);
                            }
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
    }
}
app/src/main/java/com/dayu/recharge/activity/DomainActivity.java
@@ -7,7 +7,7 @@
import com.dayu.recharge.databinding.ActivityDomainBinding;
import com.dayu.recharge.dbBean.DomainBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
/**
 * Created by Android Studio.
@@ -34,27 +34,27 @@
                String port = binding.port.getText().toString();
                int portInt = 0;
                if (TextUtils.isEmpty(domainNumber)) {
                    ToastUtil.show("请输入正确的域名序号");
                    TipUtil.show("请输入正确的域名序号");
                    return;
                }
                if (TextUtils.isEmpty(port)) {
                    ToastUtil.show("请输入正确的端口号");
                    TipUtil.show("请输入正确的端口号");
                    return;
                } else {
                    portInt = Integer.valueOf(port);
                }
                if (TextUtils.isEmpty(domain)) {
                    ToastUtil.show("请输入域名");
                    TipUtil.show("请输入域名");
                    return;
                } else if (portInt <= 0 || portInt > 65535) {
                    ToastUtil.show("请输入正确的端口号");
                    TipUtil.show("请输入正确的端口号");
                    return;
                }
                domainBean.setDomainNumber(domainNumber);
                domainBean.setDomain(domain);
                domainBean.setPort(portInt);
                baseDao.domainPortDao().insert(domainBean);
                ToastUtil.show("保存成功");
                TipUtil.show("保存成功");
                initData();
            }
        });
app/src/main/java/com/dayu/recharge/activity/ElectricPriceActivity.java
@@ -7,7 +7,7 @@
import com.dayu.recharge.databinding.ActivityElectricPriceBinding;
import com.dayu.recharge.dbBean.ElectricPriceBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
/**
 * Copyright (C), 2023,
@@ -33,10 +33,10 @@
                if (!TextUtils.isEmpty(electricPriceBinding.electricNewNum.getText())) {
                    electricPriceBean.setPrice(Float.parseFloat(electricPriceBinding.electricNewNum.getText().toString()));
                    baseDao.electricPriceDao().insert(electricPriceBean);
                    ToastUtil.show("保存成功");
                    TipUtil.show("保存成功");
                    initData();
                } else {
                    ToastUtil.show("请输入正确金额");
                    TipUtil.show("请输入正确金额");
                }
            }
        });
app/src/main/java/com/dayu/recharge/activity/HomeActivity.java
@@ -8,7 +8,7 @@
import com.dayu.recharge.databinding.ActivityHomeBinding;
import com.dayu.recharge.dbBean.AdminDataBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.permissionx.guolindev.PermissionX;
@@ -20,12 +20,13 @@
 */
public class HomeActivity extends BaseActivity {
    public static HomeActivity homeActivity;
    ActivityHomeBinding homeBinding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        homeActivity = this;
        homeBinding = ActivityHomeBinding.inflate(LayoutInflater.from(this));
        setContentView(homeBinding.getRoot());
        initView();
@@ -52,11 +53,11 @@
        homeBinding.homeNewCard.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AdminDataBean adminData= baseDao.adminDao().findFirst();
                if (adminData!=null){
                AdminDataBean adminData = baseDao.adminDao().findFirst();
                if (adminData != null) {
                    startActivity(new Intent(HomeActivity.this, NewCardActivity.class));
                }else {
                    ToastUtil.show("请先设置管理员信息");
                } else {
                    TipUtil.show("请先设置管理员信息");
                }
            }
@@ -64,7 +65,13 @@
        homeBinding.homeRecharge.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(HomeActivity.this, RechargeActivity.class));
                AdminDataBean adminData = baseDao.adminDao().findFirst();
                if (adminData != null) {
                    startActivity(new Intent(HomeActivity.this, RechargeActivity.class));
                } else {
                    TipUtil.show("请先设置管理员信息");
                }
            }
        });
        homeBinding.homeRedCard.setOnClickListener(new View.OnClickListener() {
app/src/main/java/com/dayu/recharge/activity/IdentifyingActivity.java
@@ -7,7 +7,7 @@
import com.dayu.recharge.databinding.ActivityIdentyfyingBinding;
import com.dayu.recharge.dbBean.IdentityBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
/**
 * Created by Android Studio.
@@ -41,9 +41,9 @@
                if (!TextUtils.isEmpty(data)){
                    myIdentityBean.setIdentity(binding.electricOldNumber.getText().toString());
                    baseDao.identityDao().insert(myIdentityBean);
                    ToastUtil.show("保存成功");
                    TipUtil.show("保存成功");
                }else {
                    ToastUtil.show("请输入卡标识");
                    TipUtil.show("请输入卡标识");
                }
            }
app/src/main/java/com/dayu/recharge/activity/MyActivity.java
@@ -16,8 +16,7 @@
import com.dayu.recharge.net.SocketNet;
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.utils.ExcelUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.PassWordDialog;
import com.dayu.recharge.view.datepicker.CustomDatePicker;
import com.dayu.recharge.view.datepicker.DateFormatUtils;
@@ -143,7 +142,7 @@
        String[] title;
        String fileName;
        if (listData == null || listData.size() == 0) {
            ToastUtil.show(MyActivity.this, "记录为空");
            TipUtil.show(MyActivity.this, "记录为空");
            return;
        }
        if (isRechargeList) {
@@ -180,11 +179,11 @@
        try {
            adminData = baseDao.adminDao().findFirst();
            if (adminData != null) {
                myBinding.myAdminName.setText(adminData.getName());
                myBinding.myAdminName.setText(adminData.getSheng() + adminData.getShi() + adminData.getXian() + adminData.getZhen() + adminData.getCun());
                myBinding.myVillageNum.setText(adminData.getSerial());
            } else {
                myBinding.myAdminName.setText("请点击管理员设置");
                myBinding.myVillageNum.setText("请点击管理员设置");
                myBinding.myAdminName.setText("请点击地址信息设置");
                myBinding.myVillageNum.setText("请点击地址信息设置");
            }
            StringBuilder msgData = new StringBuilder();
            if (MyApplication.myApplication.isConncet) {
@@ -239,7 +238,7 @@
            public void onTimeSelected(long timestamp) {
                endTime = timestamp;
                if ((endTime < beginTime) && endTime != beginTime) {
                    ToastUtil.show(MyActivity.this, "结束时间不能晚于开始时间");
                    TipUtil.show(MyActivity.this, "结束时间不能晚于开始时间");
                } else {
                    try {
                        endTime = endTime + (1000 * 60 * 60 * 24) - 1;
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
@@ -6,6 +6,7 @@
import android.os.Message;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.widget.Toast;
import com.dayu.recharge.MyApplication;
@@ -21,7 +22,6 @@
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.databinding.ActivityWriteTextBinding;
import com.dayu.recharge.dbBean.AdminDataBean;
import com.dayu.recharge.dbBean.DeviceNumber;
import com.dayu.recharge.dbBean.ElectricPriceBean;
import com.dayu.recharge.dbBean.RechargeBean;
import com.dayu.recharge.dbBean.UserCardBean;
@@ -34,20 +34,18 @@
import com.dayu.recharge.tools.HexUtil;
import com.dayu.recharge.tools.NFCWriteHelper;
import com.dayu.recharge.tools.NfcReadHelper;
import com.dayu.recharge.tools.WriteCardUtils;
import com.dayu.recharge.utils.AidlUtil;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.DateUtil;
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.utils.MornyUtil;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import com.tencent.bugly.crashreport.CrashReport;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
 * Copyright (C), 2023,
@@ -57,21 +55,6 @@
 */
public class NFCWreatActivity extends BaseNfcActivity {
    /**
     * 该卡已写入用户信息
     */
    public final static int HAS_USER = 1;
    /**
     * 该卡未写入用户信息
     */
    public final static int NO_USER = 2;
    /**
     * 充值
     */
    public final static int RECHARGE = 3;
    public final static int ERROR = -1;
    boolean cleanFlag = false;
    boolean userFlag = false;
@@ -92,6 +75,7 @@
    String morny;
    String userName;
    AdminDataBean adminData;
    RechargeBean rechargeBean;
    Intent intent;
@@ -99,7 +83,6 @@
    RegisteredCard registeredCard;
    CleanUserCard cleanUserCard;
    volatile UserCard userCard;
    ManageCard manageCard;
    DomainCard domainCard;
@@ -116,6 +99,11 @@
     * 是否是用户卡,假如是用户卡的话需要检测卡片是否已经开过户,假如已开户则报错不能再写卡
     */
    boolean isUser = false;//
    //是否是充值过程
    boolean isRecharge = false;
    //充值通信是否完成
    boolean rechargeIsOk = false;
    ActivityWriteTextBinding binding;
    @Override
@@ -124,7 +112,7 @@
        try {
            binding = ActivityWriteTextBinding.inflate(LayoutInflater.from(this));
            setContentView(binding.getRoot());
            initView();
            nfcWreatActivity = this;
            getData();
            baseApp = (MyApplication) getApplication();
@@ -134,12 +122,36 @@
        }
    }
    private void initView() {
        handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                switch (msg.what) {
                    case HAS_USER://判断已写入用户
                        binding.textView.setText("该卡已经写入用户信息,请更换卡片");
                        binding.textView.setTextColor(getResources().getColor(R.color.red));
                        stopAnim();
                        break;
                    case NO_USER://没有写过用户继续保存
                        saveData();
                        break;
                    default:
                        stopAnim();
                        TipUtil.show(NFCWreatActivity.this, "卡片读取失败");
                        break;
                }
                return false;
            }
        });
    }
    private void getData() {
        try {
            if (this.getIntent().hasExtra("userCard")) {
                userCard = (UserCard) this.getIntent().getSerializableExtra("userCard");
                isUser = true;
            }
            if (this.getIntent().hasExtra("cleanCard")) {
                cleanCard = (CleanCard) this.getIntent().getSerializableExtra("cleanCard");
@@ -155,6 +167,7 @@
            }
            if (this.getIntent().hasExtra("dbUserCard")) {
                userCardBean = (UserCardBean) this.getIntent().getSerializableExtra("dbUserCard");
                isUser = true;
            }
            if (this.getIntent().hasExtra("cleanUserCard")) {
                cleanUserCard = (CleanUserCard) this.getIntent().getSerializableExtra("cleanUserCard");
@@ -177,8 +190,13 @@
                binding.cardData.setText("制作配置水泵功率卡");
            }
            if (this.getIntent().hasExtra("morny")) {
                startAnim();
                isRecharge = true;
                morny = this.getIntent().getStringExtra("morny");
                userName = this.getIntent().getStringExtra("userName");
                binding.cardData.setText("充值金额:" + morny + "元");
                // 充值逻辑
                recharge(userCard.getInitPeasantCode(), userName, "启用");
            }
            try {
@@ -239,8 +257,8 @@
                    || domainCard != null || testCard != null
                    || configureDeviceRegistrationCrad != null
                    || configurationPowerCard != null) {
                if (userCard != null) {
                    setUser(intent, userCard);
                if (userCard != null && TextUtils.isEmpty(morny)) {
                    userFlag = WriteCardUtils.setUser(intent, userCard);
                }
                if (cleanCard != null) {
                    setClean(intent, cleanCard);
@@ -269,19 +287,14 @@
                if ((configPowerFlag || configDeviceRegiestFlag || testCardFlag || domainCrdFlag || userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag || cleanUserCardFlag)) {
                    try {
                        if (userFlag && userCardBean != null) {
                            ToastUtil.show(this, "注册成功");
                            NFCWreatActivity.this.finish();
                            if (NewCardActivity.newCardActivity != null) {
                                NewCardActivity.newCardActivity.finish();
                            }
                            //用户卡
                            startDetailActivity(userCardBean.getUserName(), "启用");
                        } else if (!TextUtils.isEmpty(morny)) {
                            NFCWreatActivity.this.finish();
                            ToastUtil.show(this, "充值成功");
                            TipUtil.show("充值成功");
                        } else {
                            NFCWreatActivity.this.finish();
                            ToastUtil.show(this, "写卡成功");
                            TipUtil.show("写卡成功");
                        }
                    } catch (Exception e) {
@@ -289,17 +302,19 @@
                        CrashReport.postCatchedException(e);
                    }
                } else {
                    ToastUtil.show(this, "写卡失败");
                    TipUtil.show("写卡失败");
                }
                stopAnim();
            } else if (!TextUtils.isEmpty(morny)) {
                readAllData(intent);
            } else if (userCard == null && userCardBean != null) {
            }
//            else if (!TextUtils.isEmpty(morny)) {
//
//            }
            else if (userCard == null && userCardBean != null) {
                //补卡逻辑
                selectBalance(userCardBean.getInitPeasantCode());
            } else {
                stopAnim();
                ToastUtil.show(this, "参数错误");
                TipUtil.show(this, "参数错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
@@ -309,11 +324,19 @@
    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        try {
            this.intent = intent;
            startAnim();
            if (isUser) {
                checkHasUser();
            } else if (isRecharge) {
                if (rechargeIsOk) {
                    rechargeWrratCard();
                } else {
                    Toast.makeText(this, "正在通信请稍后", Toast.LENGTH_SHORT).show();
                }
            } else {
                saveData();
            }
@@ -322,65 +345,6 @@
            CrashReport.postCatchedException(e);
        }
    }
    /**
     * 读取全部数据
     */
    private void readAllData(Intent intent) {
        try {
            NfcReadHelper.getInstence(intent)
                    .getAllData(new NfcReadHelper.NFCCallListback() {
                        @Override
                        public void callBack(Map<String, List<byte[]>> data) {
                            Message message = new Message();
//                           获取1扇区数据
                            List<byte[]> oneSector = data.get("1");
                            if (oneSector != null && oneSector.size() > 0) {
                                userCard = UserCard.getBean(oneSector);
                                message.what = RECHARGE;
                            } else {
                                message.what = ERROR;
                            }
                            handler.sendMessage(message);
                        }
                        @Override
                        public void error(int code) {
                            Message message = new Message();
                            message.what = ERROR;
                            handler.sendMessage(message);
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
    }
    Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case HAS_USER://判断已写入用户
                    ToastUtil.show(NFCWreatActivity.this, "该卡已经写入用户信息,请更换卡片");
                    break;
                case NO_USER://没有写过用户继续保存
                    saveData();
                    break;
                case RECHARGE://充值流程
                    selectBalance(userCard.getInitPeasantCode());
                    break;
                default:
                    stopAnim();
                    ToastUtil.show(NFCWreatActivity.this, "卡片读取失败");
                    break;
            }
            return false;
        }
    });
    /**
@@ -426,7 +390,7 @@
    //充值上传(Socket)
    private void recharge(String initPeasantCode) {
    private void recharge(String initPeasantCode, String name, String statu) {
        try {
            RechargeRequestBean rechargeRequestBean = new RechargeRequestBean();
            rechargeRequestBean.setControl("01");
@@ -436,46 +400,61 @@
            rechargeRequestBean.setAFN("95");
            rechargeRequestBean.setInitPeasantCode(initPeasantCode);
            rechargeRequestBean.setBalance(morny);
            rechargeRequestBean.setOrderId(SocketUtil.getOrderId(NFCWreatActivity.this));
            SocketNet.getInstance().sendTestMessage(rechargeRequestBean.pack(), new SocketCallBack() {
                @Override
                public void onSocketResponse(SocketData readData) {
                    //金额
                    byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7);
                    int balance = SocketUtil.get16to10LowHigh(blanceByte);
                    //姓名
                    byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19);
                    userName = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                    byte[] orderByte = Arrays.copyOfRange(readData.getBodyBytes(), 19, 27);
                    String orderId = BcdUtil.bcdToStr(orderByte);
                    if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                        String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);
                        //00启用01禁用02隶属信息不符03无此卡信息04其它
                        if ("00".equalsIgnoreCase(state)) {
                            rechargeIsOk = true;
                            binding.cardData.setText("充值通信完成,请帖卡充值");
                            rechargeBean = new RechargeBean();
                            rechargeBean.setDate(System.currentTimeMillis());
                            rechargeBean.setMorny(morny);
                            rechargeBean.setUserName(name);
                            rechargeBean.setSerial(adminData.getSerial());
                            userCard.setRechargeDate(Calendar.getInstance());
                            rechargeBean.setBalance(MornyUtil.changeF2Y(balance + MornyUtil.changeY2F(morny)) + "");
                            rechargeBean.setInitPeasantCode(initPeasantCode);
                            rechargeBean.setOrderID(orderId);
                            try {
                                baseDao.rechargeDao().insert(rechargeBean);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            userCard.setRechargeTimes(userCard.getRechargeTimes() + 1);
                            setUser(intent, userCard);
                            //   打印相关
                            setPrinterData(rechargeBean);
                            ToastUtil.show(NFCWreatActivity.this, "写卡成功");
                            RechargeActivity.rechargeActivity.finish();
                            NFCWreatActivity.nfcWreatActivity.finish();
                        } else if ("01".equalsIgnoreCase(state)) {
                            userCard.setState("01");
                            userFlag = WriteCardUtils.setUser(intent, userCard);
                            NFCWreatActivity.this.finish();
                            ToastUtil.show(NFCWreatActivity.this, "充值报文错误-禁用");
                            TipUtil.show("充值报文错误-禁用");
                        } else if ("02".equalsIgnoreCase(state)) {
                            ToastUtil.show(NFCWreatActivity.this, "充值报文错误-隶属信息不符");
                            TipUtil.show("充值报文错误-隶属信息不符");
                            NFCWreatActivity.this.finish();
                        } else if ("03".equalsIgnoreCase(state)) {
                            ToastUtil.show(NFCWreatActivity.this, "充值报文错误-无此卡信息");
                            TipUtil.show("充值报文错误-无此卡信息");
                            NFCWreatActivity.this.finish();
                        } else {
                            ToastUtil.show(NFCWreatActivity.this, "充值报文错误-其它");
                            TipUtil.show("充值报文错误-其它");
                            NFCWreatActivity.this.finish();
                        }
                    } else {
                        //校验CRC错误
                        ToastUtil.show(NFCWreatActivity.this, "充值报文错误校验CRC错误");
                        TipUtil.show(NFCWreatActivity.this, "充值报文错误校验CRC错误");
                        NFCWreatActivity.this.finish();
                    }
                    stopAnim();
@@ -484,7 +463,7 @@
                @Override
                public void onSocketError(int code, String msg) {
                    stopAnim();
                    ToastUtil.show(NFCWreatActivity.this, msg);
                    TipUtil.show(NFCWreatActivity.this, msg);
                }
            });
        } catch (Exception e) {
@@ -494,13 +473,31 @@
    }
    private void setmanageCard(Intent intent, final ManageCard manageCard) {
        NFCWriteHelper.getInstence(intent).writeData(manageCard.toZeroByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                manageCardFlag = flag;
    //往卡内写充值后的数据
    private void rechargeWrratCard() {
        UserCard userCardold = NfcReadHelper.getInstence(intent).getUserCardData();
        if (userCardold != null) {
            //判断是否充值的是一个卡
            if (userCard.getInitPeasantCode().equals(userCardold.getInitPeasantCode())) {
                userCard.setState("00");
                userFlag = WriteCardUtils.setUser(intent, userCard);
                //   打印相关
                if (userFlag) {
                    setPrinterData(rechargeBean);
                    startDetailActivity(userName, "启用");
                } else {
                    TipUtil.show(NFCWreatActivity.this, "写卡失败,请重新再试");
                }
            } else {
                TipUtil.show(NFCWreatActivity.this, "读取的卡和充值的卡不一致");
            }
        });
        } else {
        }
    }
    private void setmanageCard(Intent intent, final ManageCard manageCard) {
        manageCardFlag = NFCWriteHelper.getInstence(intent).writeData(manageCard.toZeroByte(), 1, 0);
    }
    /**
@@ -510,41 +507,9 @@
     * @param clearOrInitCard
     */
    private void setClean(Intent intent, final CleanCard clearOrInitCard) {
        NFCWriteHelper.getInstence(intent).writeData(clearOrInitCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                cleanFlag = flag;
            }
        });
        cleanFlag = NFCWriteHelper.getInstence(intent).writeData(clearOrInitCard.toByte(), 1, 0);
    }
    //向卡写入用户信息
    private void setUser(Intent intent, UserCard userCard) {
        NFCWriteHelper.getInstence(intent).writeData(userCard.getZeroBytes(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                userFlag = flag;
            }
        });
        if (!userFlag) {
            return;
        }
        NFCWriteHelper.getInstence(intent).writeData(userCard.getOneBytes(), 1, 1, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                userFlag = flag;
            }
        });
        if (!userFlag) {
            return;
        }
        NFCWriteHelper.getInstence(intent).writeData(userCard.getTwoBytes(), 1, 2, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                userFlag = flag;
            }
        });
    }
    /**
     * 重新注册设备卡
@@ -553,12 +518,7 @@
     * @param registeredCard
     */
    private void setRegisteredCard(Intent intent, RegisteredCard registeredCard) {
        NFCWriteHelper.getInstence(intent).writeData(registeredCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                registeredFlag = flag;
            }
        });
        registeredFlag = NFCWriteHelper.getInstence(intent).writeData(registeredCard.toByte(), 1, 0);
    }
    /**
@@ -568,12 +528,7 @@
     * @param cleanUserCard
     */
    private void setCleanUserCard(Intent intent, CleanUserCard cleanUserCard) {
        NFCWriteHelper.getInstence(intent).writeData(cleanUserCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                cleanUserCardFlag = flag;
            }
        });
        cleanUserCardFlag = NFCWriteHelper.getInstence(intent).writeData(cleanUserCard.toByte(), 1, 0);
    }
    /**
@@ -584,30 +539,15 @@
     */
    private void setDomainCard(Intent intent, DomainCard domainCard) {
        try {
            NFCWriteHelper.getInstence(intent).writeData(domainCard.getZeroByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
                @Override
                public void isSusses(boolean flag) {
                    domainCrdFlag = flag;
                }
            });
            domainCrdFlag = NFCWriteHelper.getInstence(intent).writeData(domainCard.getZeroByte(), 1, 0);
            if (!domainCrdFlag) {
                return;
            }
            NFCWriteHelper.getInstence(intent).writeData(domainCard.getOneByte(), 1, 1, new NFCWriteHelper.NFCCallback() {
                @Override
                public void isSusses(boolean flag) {
                    domainCrdFlag = flag;
                }
            });
            domainCrdFlag = NFCWriteHelper.getInstence(intent).writeData(domainCard.getOneByte(), 1, 1);
            if (!domainCrdFlag) {
                return;
            }
            NFCWriteHelper.getInstence(intent).writeData(domainCard.getTwoByte(), 1, 2, new NFCWriteHelper.NFCCallback() {
                @Override
                public void isSusses(boolean flag) {
                    domainCrdFlag = flag;
                }
            });
            domainCrdFlag = NFCWriteHelper.getInstence(intent).writeData(domainCard.getTwoByte(), 1, 2);
        } catch (Exception e) {
            domainCrdFlag = false;
            throw new RuntimeException(e);
@@ -615,38 +555,41 @@
    }
    private void setTestCard(Intent intent, TestCard testCard) {
        NFCWriteHelper.getInstence(intent).writeData(testCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                testCardFlag = flag;
            }
        });
        testCardFlag = NFCWriteHelper.getInstence(intent).writeData(testCard.toByte(), 1, 0);
    }
    private void setConfigDeviceRegiest(Intent intent, ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad) {
        NFCWriteHelper.getInstence(intent).writeData(configureDeviceRegistrationCrad.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
            @Override
            public void isSusses(boolean flag) {
                configDeviceRegiestFlag = flag;
            }
        });
        configDeviceRegiestFlag = NFCWriteHelper.getInstence(intent).writeData(configureDeviceRegistrationCrad.toByte(), 1, 0);
    }
    private void setConfigurationPower(Intent intent, ConfigurationPowerCard configurationPowerCard) {
        try {
            NFCWriteHelper.getInstence(intent).writeData(configurationPowerCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() {
                @Override
                public void isSusses(boolean flag) {
                    configPowerFlag = flag;
                }
            });
            configPowerFlag = NFCWriteHelper.getInstence(intent).writeData(configurationPowerCard.toByte(), 1, 0);
        } catch (Exception e) {
            configPowerFlag = false;
            throw new RuntimeException(e);
        }
    }
    private void startDetailActivity(String userName, String statu) {
        Intent detail = new Intent(this, RechargeDetail.class);
        detail.putExtra("userName", userName);
        detail.putExtra("statu", statu);
        detail.putExtra("userCard", userCard);
        if (!TextUtils.isEmpty(morny)) {
            detail.putExtra("morny", morny);
        }
        startActivity(detail);
        if (NewCardActivity.newCardActivity != null) {
            NewCardActivity.newCardActivity.finish();
        }
        if (RechargeActivity.rechargeActivity != null) {
            RechargeActivity.rechargeActivity.finish();
        }
        NFCWreatActivity.nfcWreatActivity.finish();
    }
    /**
     * 查询余额
@@ -672,7 +615,6 @@
                        try {
                            stateText = new StringBuffer();
                            stateText.append("状    态:");
                            String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);  //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s
                            if (userCard == null) {
                                userCard = new UserCard();
@@ -691,57 +633,32 @@
                                userCard.setAddressCode(adminData.getAddressCode());
                                userCard.setInitPeasantCode(initPeasantCode);
                            }
                            //只有启动状态才能充值
                            //金额
                            byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7);
                            int balance = SocketUtil.get16to10LowHigh(blanceByte);
                            //姓名
                            byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19);
                            String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                            if ("00".equals(state)) {
                                //只有启动状态才能充值
                                //金额
                                byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7);
                                int balance = SocketUtil.get16to10LowHigh(blanceByte);
                                //姓名
                                byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19);
                                String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                                userCard.setBalance(balance);
                                //与socket服务器通信后进行后续操作
                                if (!TextUtils.isEmpty(morny)) {
                                    //充值
                                    rechargeBean = new RechargeBean();
                                    rechargeBean.setDate(System.currentTimeMillis());
                                    rechargeBean.setMorny(morny);
                                    if (userCardBean != null) {
                                        rechargeBean.setUserName(userCardBean.getUserName());
                                    } else {
                                        rechargeBean.setUserName(name);
                                    }
                                    List<UserCardBean> userCardBeans = baseDao.userCardDao().findAll();
                                    String userId = "";
                                    if (userCardBeans != null) {
                                        for (int i = 0; i < userCardBeans.size(); i++) {
                                            if (initPeasantCode.equalsIgnoreCase(userCardBeans.get(i).getInitPeasantCode())) {
                                                userId = userCardBeans.get(i).getUserID();
                                            }
                                        }
                                    }
                                    rechargeBean.setSerial(adminData.getSerial());
                                    userCard.setRechargeDate(Calendar.getInstance());
                                    rechargeBean.setBalance(MornyUtil.changeF2Y(balance + MornyUtil.changeY2F(morny)) + "");
                                    rechargeBean.setUserId(userId);
                                    recharge(initPeasantCode);
                                } else {
                                    //补卡逻辑
                                    setUser(intent, userCard);
                                    if (userFlag) {
                                        NFCWreatActivity.this.finish();
                                        ToastUtil.show(NFCWreatActivity.this, "补卡成功");
                                    }
                                }
                                stateText.append("启用");
                                userCard.setBalance(balance);
                                userCard.setState("00");
                                //补卡逻辑
                                userFlag = WriteCardUtils.setUser(intent, userCard);
                                if (userFlag) {
                                    NFCWreatActivity.this.finish();
                                    TipUtil.show(NFCWreatActivity.this, "补卡成功");
                                }
                                return;
                            } else if ("01".equals(state)) {
                                stateText.append("禁用");
                                userCard.setState("01");
                                setUser(intent, userCard);
                                userCard.setBalance(balance);
                                userFlag = WriteCardUtils.setUser(intent, userCard);
                                startDetailActivity(name, stateText.toString());
                            } else if ("02".equals(state)) {
                                stateText.append("隶属信息不符");
                            } else if ("03".equals(state)) {
@@ -749,21 +666,23 @@
                            } else if ("04".equals(state)) {
                                stateText.append("其它");
                            }
                            ToastUtil.show(NFCWreatActivity.this, stateText.toString());
                            stopAnim();
                            binding.cardData.setText(stateText);
                            TipUtil.show(NFCWreatActivity.this, stateText.toString());
                        } catch (Exception e) {
                            e.printStackTrace();
                            stopAnim();
                        }
                    } else {
                        //校验CRC错误
                        ToastUtil.show(NFCWreatActivity.this, "开卡报文校验CRC错误");
                        TipUtil.show(NFCWreatActivity.this, "开卡报文校验CRC错误");
                    }
                }
                @Override
                public void onSocketError(int code, String msg) {
                    stopAnim();
                    ToastUtil.show(NFCWreatActivity.this, msg);
                    TipUtil.show(NFCWreatActivity.this, msg);
                }
            });
        } catch (Exception e) {
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -29,8 +29,7 @@
import com.dayu.recharge.tools.Utils;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import com.permissionx.guolindev.PermissionX;
import org.json.JSONException;
@@ -67,7 +66,8 @@
    }
    private void initView() {
        newCardBinding.newCardId.setFilters(new InputFilter[] { new AlphaNumericXFilter(),new InputFilter.LengthFilter(18) });
        newCardBinding.newCardName.setFilters(new InputFilter[]{new ChineseInputFilter()});
        newCardBinding.newCardId.setFilters(new InputFilter[]{new AlphaNumericXFilter(), new InputFilter.LengthFilter(18)});
        //身份证识别
        newCardBinding.newCardScanBtn.setOnClickListener(new View.OnClickListener() {
            @Override
@@ -91,13 +91,13 @@
                        && !TextUtils.isEmpty(phone) && !TextUtils.isEmpty(userID)
                ) {
                    if (userName.length() <= 1 || !validateName(userName)) {
                        ToastUtil.show(NewCardActivity.this, "请输入正确姓名");
                        TipUtil.show(NewCardActivity.this, "请输入正确姓名");
                        return;
                    } else if (phone.length() < 11) {
                        ToastUtil.show(NewCardActivity.this, "请输入正确手机号");
                        TipUtil.show(NewCardActivity.this, "请输入正确手机号");
                        return;
                    } else if (!Utils.check(userID)) {
                        ToastUtil.show(NewCardActivity.this, "请输入正确身份证号");
                        TipUtil.show(NewCardActivity.this, "请输入正确身份证号");
                        return;
                    } else {
                        dialog = ProgressDialog.show(NewCardActivity.this, "", "正在通信请稍后", true, true);
@@ -111,7 +111,7 @@
                    }
                } else {
                    ToastUtil.show(NewCardActivity.this, "请输入完整内容");
                    TipUtil.show(NewCardActivity.this, "请输入完整内容");
                }
            }
        });
@@ -146,7 +146,7 @@
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK){
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case SCAN_IDCARD_REQUEST:
                    String result = data.getStringExtra("OCRResult");
@@ -197,7 +197,7 @@
        String initCode = DeviceNumberUtils.getDeviceNumber();
        if (TextUtils.isEmpty(initCode)) {
            ToastUtil.show(this, "设备注册号为空,请先设置IP和管理员地址");
            TipUtil.show(this, "设备注册号为空,请先设置IP和管理员地址");
            IpBean ipBean = baseDao.ipDao().findFirst();
            if (ipBean != null && adminData != null) {
                MyApplication.myApplication.initMachineRequestBean(ipBean.getIp(), ipBean.getPort(), adminData.getAddressCode());
@@ -259,21 +259,21 @@
                        intent.putExtra("dbUserCard", userCardBean);
                        startActivity(intent);
                    } else if (state.equalsIgnoreCase("01")) {
                        ToastUtil.show(NewCardActivity.this, "开卡报文--身份证已注册");
                        TipUtil.show(NewCardActivity.this, "开卡报文--身份证已注册");
                    } else if (state.equalsIgnoreCase("02")) {
                        ToastUtil.show(NewCardActivity.this, "开卡报文--其他原因失败");
                        TipUtil.show(NewCardActivity.this, "开卡报文--其他原因失败");
                    }
                } else {
                    //校验CRC错误
                    ToastUtil.show(NewCardActivity.this, "开卡报文校验CRC错误");
                    TipUtil.show(NewCardActivity.this, "开卡报文校验CRC错误");
                }
            }
            @Override
            public void onSocketError(int code, String msg) {
                dialog.dismiss();
                ToastUtil.show(NewCardActivity.this, msg);
                TipUtil.show(NewCardActivity.this, msg);
            }
        });
@@ -300,4 +300,27 @@
            return null; // 允许输入字符
        }
    }
    public class ChineseInputFilter implements InputFilter {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            StringBuilder builder = new StringBuilder();
            for (int i = start; i < end; i++) {
                char currentChar = source.charAt(i);
                // 只允许汉字
                if (isChineseCharacter(currentChar)) {
                    builder.append(currentChar);
                }
            }
            return builder.toString();
        }
        private boolean isChineseCharacter(char c) {
            // 这里使用Unicode范围判断是否为汉字
            // 汉字的Unicode范围是:0x4e00 - 0x9fa5
            return (c >= 0x4e00 && c <= 0x9fa5);
        }
    }
}
app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
@@ -5,12 +5,11 @@
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import com.dayu.recharge.adapter.NewCardAdapter;
import com.dayu.recharge.databinding.ActivityNewcardListBinding;
import com.dayu.recharge.dbBean.UserCardBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.datepicker.CustomDatePicker;
import com.dayu.recharge.view.datepicker.DateFormatUtils;
@@ -90,7 +89,7 @@
            public void onTimeSelected(long timestamp) {
                endTime = timestamp;
                if ((endTime < beginTime) && endTime != beginTime) {
                    ToastUtil.show(NewCardListActivity.this, "结束时间不能晚于开始时间");
                    TipUtil.show(NewCardListActivity.this, "结束时间不能晚于开始时间");
                } else {
                    try {
                        endTime = endTime + (1000 * 60 * 60 * 24) - 1;
app/src/main/java/com/dayu/recharge/activity/PassWordActivity.java
@@ -7,7 +7,7 @@
import com.dayu.recharge.databinding.ActivityPswBinding;
import com.dayu.recharge.dbBean.PassWordBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.utils.WSMD5;
/**
@@ -44,16 +44,16 @@
                            if (pswBinding.pswNew.getText().toString().equals(pswBinding.pswNewAgin.getText().toString())) {
                                passWordBean.setPassWord(pswBinding.pswNewAgin.getText().toString());
                                baseDao.loginPsDao().insert(passWordBean);
                                ToastUtil.show(PassWordActivity.this, "密码修改完成");
                                TipUtil.show(PassWordActivity.this, "密码修改完成");
                                PassWordActivity.this.finish();
                            } else {
                                ToastUtil.show(PassWordActivity.this, "两次输入的密码不一致");
                                TipUtil.show(PassWordActivity.this, "两次输入的密码不一致");
                            }
                        } else {
                            ToastUtil.show(PassWordActivity.this, "旧密码输入错误");
                            TipUtil.show(PassWordActivity.this, "旧密码输入错误");
                        }
                    } else {
                        ToastUtil.show(PassWordActivity.this, "请输完内容");
                        TipUtil.show(PassWordActivity.this, "请输完内容");
                    }
app/src/main/java/com/dayu/recharge/activity/PowerActivity.java
@@ -7,7 +7,7 @@
import com.dayu.recharge.databinding.ActivityPowerBinding;
import com.dayu.recharge.dbBean.PowerBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
/**
 * Copyright (C), 2023,
@@ -44,11 +44,11 @@
                if (!TextUtils.isEmpty(data)) {
                    powerBean.setPower(data);
                    baseDao.powerDao().insert(powerBean);
                    ToastUtil.show("保存成功");
                    TipUtil.show("保存成功");
//                    PowerActivity.this.finish();
                    initData();
                } else {
                    ToastUtil.show("请输入水泵功率");
                    TipUtil.show("请输入水泵功率");
                }
            }
        });
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
@@ -5,7 +5,6 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -14,8 +13,6 @@
import com.dayu.recharge.card.DomainCard;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.databinding.ActivityRedCardBinding;
import com.dayu.recharge.dbBean.RechargeBean;
import com.dayu.recharge.dbBean.UserCardBean;
import com.dayu.recharge.net.SocketCallBack;
import com.dayu.recharge.net.SocketData;
import com.dayu.recharge.net.SocketNet;
@@ -23,13 +20,13 @@
import com.dayu.recharge.tools.BcdUtil;
import com.dayu.recharge.tools.HexUtil;
import com.dayu.recharge.tools.NfcReadHelper;
import com.dayu.recharge.tools.WriteCardUtils;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.utils.MornyUtil;
import com.dayu.recharge.utils.MyCommon;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import java.util.Arrays;
import java.util.Calendar;
@@ -60,6 +57,8 @@
    volatile UserCard userCard;
    ActivityRedCardBinding redCardBinding;
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
@@ -96,6 +95,8 @@
    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        this.intent = intent;
        startAnim();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
            readAllData(intent);
@@ -105,7 +106,8 @@
    /**
     * 读取全部数据
     */
    private void readAllData(Intent intent) {
   public   void readAllData(Intent intent) {
        NfcReadHelper.getInstence(intent)
                .getAllData(new NfcReadHelper.NFCCallListback() {
                    @Override
@@ -227,10 +229,10 @@
                    break;
                case MyCommon.ERROR_MOVE:
                    stopAnim();
                    ToastUtil.show("连接中断,请重新贴合卡片");
                    TipUtil.show("连接中断,请重新贴合卡片");
                    break;
                default:
                    ToastUtil.show(ReadCardAcitivy.this, "卡片无法识别");
                    TipUtil.show(ReadCardAcitivy.this, "卡片无法识别");
                    stopAnim();
                    break;
            }
@@ -281,11 +283,23 @@
                    try {
                        stateText = new StringBuffer();
//                        stateText.append("状    态:");
                        //金额
                        byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7);
                        int balance = SocketUtil.get16to10LowHigh(blanceByte);
                        //姓名
                        byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19);
                        String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                        setUserData(name, balance, stateText.toString());
                        String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);  //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s
                        if ("00".equals(state)) {
                            userCard.setBalance(balance);
                            userCard.setState("00");
                            WriteCardUtils.setUser(intent, userCard);
                            stateText.append("启用");
                        } else if ("01".equals(state)) {
                            userCard.setBalance(balance);
                            userCard.setState("01");
                            WriteCardUtils.setUser(intent, userCard);
                            stateText.append("禁用");
                        } else if ("02".equals(state)) {
                            stateText.append("隶属信息不符");
@@ -294,29 +308,22 @@
                        } else if ("04".equals(state)) {
                            stateText.append("其它");
                        }
                        //金额
                        byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7);
                        int balance = SocketUtil.get16to10LowHigh(blanceByte);
                        //姓名
                        byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19);
                        String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                        setUserData(name, balance, stateText.toString());
                        stopAnim();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    //校验CRC错误
                    ToastUtil.show(ReadCardAcitivy.this, "开卡报文校验CRC错误");
                    TipUtil.show(ReadCardAcitivy.this, "开卡报文校验CRC错误");
                }
                stopAnim();
            }
            @Override
            public void onSocketError(int code, String msg) {
                ToastUtil.show(ReadCardAcitivy.this, msg);
                TipUtil.show(ReadCardAcitivy.this, msg);
            }
        });
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
@@ -10,10 +10,22 @@
import android.widget.EditText;
import com.dayu.recharge.databinding.ActivityRechargeBinding;
import com.dayu.recharge.dbBean.AdminDataBean;
import com.dayu.recharge.net.SocketCallBack;
import com.dayu.recharge.net.SocketData;
import com.dayu.recharge.net.SocketNet;
import com.dayu.recharge.socketBean.BalanceSelecteRequestBean;
import com.dayu.recharge.tools.BcdUtil;
import com.dayu.recharge.tools.NfcReadHelper;
import com.dayu.recharge.tools.WriteCardUtils;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.MornyUtil;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.TipUtil;
import com.tencent.bugly.crashreport.CrashReport;
import java.util.Arrays;
/**
@@ -22,11 +34,16 @@
 * Date: 2023-11-5 09:52
 * Description: 充值界面
 */
public class RechargeActivity extends BaseActivity {
public class RechargeActivity extends BaseNfcActivity {
    Intent intent;
    boolean userFlag;
    ActivityRechargeBinding binding;
    public static RechargeActivity rechargeActivity;
    AdminDataBean adminData;
    String userName;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
@@ -43,7 +60,33 @@
        }
    }
    public void onNewIntent(Intent intent) {
        try {
            this.intent = intent;
            userCard = NfcReadHelper.getInstence(intent).getUserCardData();
            if (userCard != null) {
                selectBalance(userCard.getInitPeasantCode());
            } else {
                TipUtil.show(RechargeActivity.this, "卡片读取失败");
            }
            readAllData(intent);
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
        super.onNewIntent(intent);
    }
    private void initView() {
        try {
            adminData = baseDao.adminDao().findFirst();
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
        binding.rechargeRegistBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
@@ -51,20 +94,22 @@
                if (!TextUtils.isEmpty(morny)) {
                    String initCode = DeviceNumberUtils.getDeviceNumber();
                    if (TextUtils.isEmpty(initCode)) {
                        ToastUtil.show(RechargeActivity.this, "设备注册号为空,请先设置IP和管理员地址");
//                return;
                        TipUtil.show(RechargeActivity.this, "设备注册号为空,请先设置IP和管理员地址");
                    }
                    Intent intent = new Intent(RechargeActivity.this, NFCWreatActivity.class);
                    intent.putExtra("morny", morny);
                    intent.putExtra("userName", userName);
                    intent.putExtra("userCard", userCard);
                    startActivity(intent);
                } else {
                    ToastUtil.show(RechargeActivity.this, "请输入充值金额(元)");
                    TipUtil.show(RechargeActivity.this, "请输入充值金额(元)");
                }
            }
        });
    }
    //校验金额
    public static void setPricePoint(final EditText editText) {
        editText.addTextChangedListener(new TextWatcher() {
            @Override
@@ -110,5 +155,81 @@
    }
    /**
     * 查询余额
     *
     * @param initPeasantCode 农户注册编号
     */
    private void selectBalance(String initPeasantCode) {
        try {
            BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean();
            requestBean.setAFN("94");
            requestBean.setControl("01");
            String initCode = DeviceNumberUtils.getDeviceNumber();
            requestBean.setInitCode(initCode);
            requestBean.setInitPeasantCode(initPeasantCode);
            requestBean.setXuLie(SocketUtil.getXuLie(this));
            SocketNet.getInstance().sendTestMessage(requestBean.pack(), new SocketCallBack() {
                @Override
                public void onSocketResponse(SocketData readData) {
                    if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                        StringBuffer stateText = null;
                        try {
                            stateText = new StringBuffer();
                            String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);  //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s
                            //只有启动状态才能充值
                            //金额
                            byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7);
                            int balance = SocketUtil.get16to10LowHigh(blanceByte);
                            //姓名
                            byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19);
                            userName = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                            if ("00".equals(state)) {
                                stateText.append("启用");
                                binding.rechargeReadLL.setVisibility(View.GONE);
                                binding.rechargeTextLL.setVisibility(View.VISIBLE);
                                binding.userName.setText(userName);
                                binding.redRemainderBlance.setText(MornyUtil.changeF2Y(balance));
                                binding.redStatu.setText(stateText.toString());
                                binding.redInitCode.setText(initPeasantCode);
                                userCard.setState("00");
                                userCard.setBalance(balance);
                                return;
                            } else if ("01".equals(state)) {
                                stateText.append("禁用");
                                userCard.setState("01");
                                userCard.setBalance(balance);
                                userFlag = WriteCardUtils.setUser(intent, userCard);
                                TipUtil.show("该卡已被禁用");
                            } else if ("02".equals(state)) {
                                stateText.append("隶属信息不符");
                            } else if ("03".equals(state)) {
                                stateText.append("无此卡信息");
                            } else if ("04".equals(state)) {
                                stateText.append("其它");
                            }
                            TipUtil.show(RechargeActivity.this, stateText.toString());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        //校验CRC错误
                        TipUtil.show(RechargeActivity.this, "开卡报文校验CRC错误");
                    }
                }
                @Override
                public void onSocketError(int code, String msg) {
                    TipUtil.show(RechargeActivity.this, msg);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
    }
}
app/src/main/java/com/dayu/recharge/activity/RechargeDetail.java
New file
@@ -0,0 +1,81 @@
package com.dayu.recharge.activity;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.databinding.ActivityRechargeDetailBinding;
import com.dayu.recharge.utils.MornyUtil;
import java.util.Calendar;
/**
 * Created by Android Studio.
 * author: zuo
 * Date: 2023-11-21
 * Time: 15:01
 * 备注:写卡后的详情页
 */
public class RechargeDetail extends BaseActivity {
    ActivityRechargeDetailBinding binding;
    UserCard userCard;
    String statu;
    String userName;
    String morny;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityRechargeDetailBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        try {
            userCard = (UserCard) getIntent().getSerializableExtra("userCard");
            statu = getIntent().getStringExtra("statu");
            userName = getIntent().getStringExtra("userName");
            if (getIntent().hasExtra("morny")) {
                morny = getIntent().getStringExtra("morny");
            }
            setUserData(userName, statu);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private void setUserData(String userName, String statu) {
        int balance = userCard.getBalance();
        if (!TextUtils.isEmpty(morny)) {
            balance = userCard.getBalance() + MornyUtil.changeY2F(morny);
            binding.redRemainderMorny.setText("充值金额:" + morny + " 元");
        } else {
            balance = userCard.getBalance();
            binding.redRemainderMorny.setVisibility(View.GONE);
        }
        binding.redName.setText("用户姓名:" + userName);
        binding.redRemainderBlance.setText("剩余金额:" + MornyUtil.changeF2Y(balance) + " 元");
        binding.redStatu.setText("卡状态:" + statu);
        if (userCard != null) {
            binding.redInitCode.setText("用户注册编号:" + userCard.getInitPeasantCode());
            Calendar calendar = userCard.getRechargeDate();
            if (calendar != null) {
                int year = calendar.get(Calendar.YEAR);
                int month = calendar.get(Calendar.MONTH); // 月份从0开始,所以需要加1
                int day = calendar.get(Calendar.DAY_OF_MONTH);
                int hour = calendar.get(Calendar.HOUR_OF_DAY);
                int minute = calendar.get(Calendar.MINUTE);
                int second = calendar.get(Calendar.SECOND);
                binding.redRechargeDate.setText("本卡最后购水日期:" + year + month + day + " " + hour + ":" + minute + ":" + second);
            } else {
                binding.redRechargeDate.setText("本卡最后购水日期:无");
            }
            binding.redRechargeNumber.setText("本卡充值次数:" + userCard.getRechargeTimes() + "");
        }
    }
}
app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
@@ -10,7 +10,7 @@
import com.dayu.recharge.databinding.ActivityRechargeListBinding;
import com.dayu.recharge.dbBean.RechargeBean;
import com.dayu.recharge.utils.ArithUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.datepicker.CustomDatePicker;
import com.dayu.recharge.view.datepicker.DateFormatUtils;
@@ -100,7 +100,7 @@
            public void onTimeSelected(long timestamp) {
                endTime = timestamp;
                if ((endTime < beginTime) && endTime != beginTime) {
                    ToastUtil.show(RechargeListActivity.this, "结束时间不能晚于开始时间");
                    TipUtil.show(RechargeListActivity.this, "结束时间不能晚于开始时间");
                } else {
                    endTime = endTime + (1000 * 60 * 60 * 24) - 1;
                    List<RechargeBean> userList = baseDao.rechargeDao().findByTime(beginTime, endTime);
app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
@@ -11,7 +11,7 @@
import com.dayu.recharge.adapter.NewCardAdapter;
import com.dayu.recharge.databinding.ActivityReplacementBinding;
import com.dayu.recharge.dbBean.UserCardBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.EdtDialog;
import java.util.List;
@@ -73,7 +73,7 @@
                            userCardBeanList.addAll(beans);
                            adapter.notifyDataSetChanged();
                        } else {
                            ToastUtil.show("未找到该用户");
                            TipUtil.show("未找到该用户");
                        }
                    }
app/src/main/java/com/dayu/recharge/activity/SysActivity.java
@@ -1,9 +1,7 @@
package com.dayu.recharge.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
@@ -18,7 +16,7 @@
import com.dayu.recharge.databinding.ActivityAdminBinding;
import com.dayu.recharge.dbBean.DomainBean;
import com.dayu.recharge.dbBean.PowerBean;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
/**
 * Copyright (C), 2023,
@@ -131,7 +129,7 @@
                    intent.putExtra("configurationPowerCard", configurationPowerCard);
                    startActivity(intent);
                } else {
                    ToastUtil.show("请先设置水泵功率");
                    TipUtil.show("请先设置水泵功率");
                }
            }
app/src/main/java/com/dayu/recharge/dbBean/RechargeBean.java
@@ -16,11 +16,33 @@
    public long id;
    private String serial;//设备序列号
    public String userName;
    public String userId;//用户身份证号
    public long date;
    public String morny;//充值金额
    public String balance;//余额
    public String total_morn;//总充值金额
    //状态 0未上传 1成功上传
    public String orderID;//订单号
    //服务器返回的农户注册编号
    private String initPeasantCode;
    public int state = 0;
    public String getOrderID() {
        return orderID;
    }
    public void setOrderID(String orderID) {
        this.orderID = orderID;
    }
    public String getInitPeasantCode() {
        return initPeasantCode;
    }
    public void setInitPeasantCode(String initPeasantCode) {
        this.initPeasantCode = initPeasantCode;
    }
    public String getTotal_morn() {
        return total_morn;
@@ -33,12 +55,6 @@
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String total_morn;//总充值金额
    //状态 0未上传 1成功上传
    public int state = 0;
    public void setTotal_morn(String total_morn) {
        this.total_morn = total_morn;
app/src/main/java/com/dayu/recharge/net/SocketNet.java
@@ -2,7 +2,6 @@
import android.content.Context;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import com.dayu.recharge.dao.BaseDaoSingleton;
@@ -15,9 +14,6 @@
import com.easysocket.interfaces.conn.ISocketActionListener;
import com.easysocket.interfaces.conn.SocketActionListener;
import com.dayu.recharge.MyApplication;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.easysocket.utils.LogUtil;
/**
@@ -29,7 +25,7 @@
public class SocketNet {
    public static SocketNet socketNet;
    SocketCallBack myCallBack;
    byte[] dataMessage;
    //    byte[] dataMessage;
    boolean isTest = false;
    Context mContext;
@@ -53,9 +49,10 @@
        // 发送
//        EasySocket.getInstance().upMessage(dataMessage);
        if (EasySocket.getInstance().getDefconnection() != null) {
            EasySocket.getInstance().disconnect(false);
            EasySocket.getInstance().connect();
            this.dataMessage = dataMessage;
//            EasySocket.getInstance().disconnect(false);
//            EasySocket.getInstance().connect();
            EasySocket.getInstance().upMessage(dataMessage);
//            this.dataMessage = dataMessage;
        } else {
            MyApplication.myApplication.initEasySocket(false, null);
        }
@@ -72,8 +69,8 @@
        isTest = true;
        mContext = context;
        if (EasySocket.getInstance().getDefOptions().getSocketAddress() != null && !MyApplication.myApplication.isDoInitMachine) {
            EasySocket.getInstance().disconnect(false);
            EasySocket.getInstance().connect();
//            EasySocket.getInstance().disconnect(false);
//            EasySocket.getInstance().connect();
        } else {
//            ToastUtil.show(mContext, "Socket地址为空");
        }
@@ -97,8 +94,9 @@
        @Override
        public void onSocketConnSuccess(SocketAddress socketAddress) {
            Log.i("SocketActionListener", "连接成功");
            MyApplication.myApplication.isConncet = true;
            DeviceNumber initCode = BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().findFirst();
            if (initCode==null && !MyApplication.myApplication.isDoInitMachine) {
            if (initCode == null && !MyApplication.myApplication.isDoInitMachine) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
@@ -111,12 +109,12 @@
                }, 500);
            }
            if (dataMessage != null) {
                EasySocket.getInstance().upMessage(dataMessage);
            }
//            if (dataMessage != null) {
//                EasySocket.getInstance().upMessage(dataMessage);
//            }
            if (isTest) {
                MyApplication.myApplication.isConncet = true;
                EasySocket.getInstance().disconnect(false);
//                EasySocket.getInstance().disconnect(false);
            } else {
            }
@@ -130,7 +128,7 @@
         */
        @Override
        public void onSocketConnFail(SocketAddress socketAddress, boolean isNeedReconnect) {
//            isConnected = false;
            MyApplication.myApplication.isConncet = false;
            Log.i("SocketActionListener", "socket连接失败");
            if (isTest) {
//                ToastUtil.show(mContext, "连接失败,请检查网络");
@@ -170,7 +168,7 @@
            SocketData socketData = new SocketData();
            socketData.setBodyData(originReadData.getBodyBytes());
            socketData.setHeaderData(originReadData.getHeaderData());
            dataMessage = null;
//            dataMessage = null;
            if (myCallBack != null) {
                myCallBack.onSocketResponse(socketData);
            }
app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
@@ -24,10 +24,10 @@
 * email 1058083107@qq.com
 * description
 */
public class NFCWriteHelper extends BaseNFCHelper{
public class NFCWriteHelper extends BaseNFCHelper {
    private Tag tag;
    private NFCWriteHelper.NFCCallback callback;
    private static NFCWriteHelper helper;
    private static int PASSWORD_LENTH = 6;
@@ -67,12 +67,12 @@
    /**
     * 写卡
     *
     * @param str      书写内容,16个字节
     * @param a        书写的扇区 (从0开始数)
     * @param b        书写的块(从0开始数)
     * @param callback 返回监听
     * @param str 书写内容,16个字节
     * @param a   书写的扇区 (从0开始数)
     * @param b   书写的块(从0开始数)
     * @param
     */
    public void writeData(byte[] str, int a, int b, NFCWriteHelper.NFCCallback callback) {
    public boolean writeData(byte[] str, int a, int b) {
        if (str.length <= 16) {
            try {
                MifareClassic mfc = MifareClassic.get(tag);
@@ -84,15 +84,13 @@
                        int count = mfc.getSectorCount();
                        //如果传进来的扇区大了或者小了直接退出方法
                        if (a > count - 1 || a < 0) {
                            callback.isSusses(false);
                            return;
                            return false;
                        }
                        //获取写的扇区的块的数量
                        int bCount = mfc.getBlockCountInSector(a);
                        //如果输入的块大了或者小了也是直接退出
                        if (b > bCount - 1 || b < 0) {
                            callback.isSusses(false);
                            return;
                            return false;
                        }
                        //验证扇区密码
                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, bytes);
@@ -100,13 +98,12 @@
                            int bIndex = mfc.sectorToBlock(a);
                            //写卡
                            mfc.writeBlock(bIndex + b, str);
                            callback.isSusses(true);
                            return;
                            return true;
                        }
                        callback.isSusses(false);
                        return false;
                    } catch (Exception e) {
                        e.printStackTrace();
                        callback.isSusses(false);
                        return false;
                    } finally {
                        try {
                            mfc.close();
@@ -117,8 +114,10 @@
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return false;
    }
app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
@@ -5,6 +5,7 @@
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.utils.MyCommon;
import java.io.IOException;
@@ -45,6 +46,64 @@
        return helper;
    }
    public UserCard getUserCardData() {
        UserCard userCard = null;
        Map<String, List<byte[]>> map = new HashMap<>();
        MifareClassic mfc = MifareClassic.get(tag);
        if (null != mfc) {
            try {
                //链接NFC
                mfc.connect();
                //获取扇区数量
                int count = mfc.getSectorCount();
                //存储空间
                int size = mfc.getSize();
                //用于判断时候有内容读取出来
                boolean flag = false;
                List<byte[]> list = new ArrayList<>();
                //验证扇区密码,否则会报错(链接失败错误)
                boolean isOpen = mfc.authenticateSectorWithKeyA(1, bytes);
                if (isOpen) {
                    //获取扇区里面块的数量
                    int bCount = mfc.getBlockCountInSector(1);
                    //获取扇区第一个块对应芯片存储器的位置(我是这样理解的,因为第0扇区的这个值是4而不是0)
                    int bIndex = mfc.sectorToBlock(1);
                    //String data1 = "";
                    for (int j = 0; j < bCount; j++) {
                        //读取数据
                        byte[] data = null;
                        try {
                            data = mfc.readBlock(bIndex);
                            bIndex++;
                            list.add(data);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    flag = true;
                }
                if (flag) {
                    userCard = UserCard.getBean(list);
                    return userCard;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    mfc.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    /**
     * 读取NFC卡的全部信息
     *
app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java
New file
@@ -0,0 +1,30 @@
package com.dayu.recharge.tools;
import android.content.Intent;
import com.dayu.recharge.card.UserCard;
/**
 * Created by Android Studio.
 * author: zuo
 * Date: 2023-11-21
 * Time: 14:46
 * 备注:
 */
public class WriteCardUtils {
    static boolean userFlag = false;
    //向卡写入用户信息
    public static boolean setUser(Intent intent, UserCard userCard) {
        userFlag = NFCWriteHelper.getInstence(intent).writeData(userCard.getZeroBytes(), 1, 0);
        if (!userFlag) {
            return false;
        }
        userFlag = NFCWriteHelper.getInstence(intent).writeData(userCard.getOneBytes(), 1, 1);
        if (!userFlag) {
            return false;
        }
        userFlag = NFCWriteHelper.getInstence(intent).writeData(userCard.getTwoBytes(), 1, 2);
        return userFlag;
    }
}
app/src/main/java/com/dayu/recharge/utils/TipUtil.java
New file
@@ -0,0 +1,38 @@
package com.dayu.recharge.utils;
import android.content.Context;
import com.dayu.recharge.activity.HomeActivity;
import com.dayu.recharge.view.TipDialog;
public class TipUtil {
    public interface TipListener {
        public void onCancle();
    }
    public static void show(Context context, String data) {
//        Toast.makeText(context, data, Toast.LENGTH_LONG).show();
        TipDialog tipDialog = new TipDialog(context, data);
        tipDialog.show();
    }
    public static void show(Context context, String data, TipListener tipListener) {
//        Toast.makeText(context, data, Toast.LENGTH_LONG).show();
        TipDialog tipDialog = new TipDialog(context, data, tipListener);
        tipDialog.show();
    }
    public static void show(String data) {
//        Toast.makeText(, data, Toast.LENGTH_LONG).show();
        TipDialog tipDialog = new TipDialog(HomeActivity.homeActivity, data);
        tipDialog.show();
    }
    public static void show(String data, TipListener tipListener) {
//        Toast.makeText(, data, Toast.LENGTH_LONG).show();
        TipDialog tipDialog = new TipDialog(HomeActivity.homeActivity, data, tipListener);
        tipDialog.show();
    }
}
app/src/main/java/com/dayu/recharge/utils/ToastUtil.java
@@ -1,18 +1,18 @@
package com.dayu.recharge.utils;
import android.content.Context;
import android.widget.Toast;
import com.dayu.recharge.MyApplication;
/**
 * Created by Android Studio.
 * author: zuo
 * Date: 2023-11-22
 * Time: 11:49
 * 备注:
 */
public class ToastUtil {
    public static void show(Context context, String data) {
        Toast.makeText(context, data, Toast.LENGTH_LONG).show();
    }
    public static void show(String data) {
        Toast.makeText(MyApplication.myApplication, data, Toast.LENGTH_LONG).show();
        Toast.makeText(MyApplication.myApplication, data, Toast.LENGTH_SHORT).show();
    }
}
app/src/main/java/com/dayu/recharge/view/EdtDialog.java
@@ -12,7 +12,7 @@
import android.widget.TextView;
import com.dayu.recharge.R;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
/**
 * Copyright (C), 2022,
@@ -52,7 +52,7 @@
            public void onClick(View v) {
                if (intent!=null){
                    if (TextUtils.isEmpty(editText.getText().toString())) {
                        ToastUtil.show(mContext, "请输入序列号");
                        TipUtil.show(mContext, "请输入序列号");
                    } else {
                        if (Integer.valueOf(editText.getText().toString()) <= 16777215) {
//                        EquipmentNumber equipmentNumber = (EquipmentNumber) intent.getSerializableExtra("equipmentNumber");
@@ -60,7 +60,7 @@
                            mContext.startActivity(intent);
                            EdtDialog.this.dismiss();
                        } else {
                            ToastUtil.show(mContext, "输入的数字不能超过16777215");
                            TipUtil.show(mContext, "输入的数字不能超过16777215");
                        }
                    }
app/src/main/java/com/dayu/recharge/view/PassWordDialog.java
@@ -1,6 +1,5 @@
package com.dayu.recharge.view;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
@@ -13,7 +12,7 @@
import com.tencent.bugly.crashreport.CrashReport;
import com.dayu.recharge.R;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.utils.WSMD5;
/**
@@ -46,7 +45,7 @@
                        mContext.startActivity(intent);
                        PassWordDialog.this.dismiss();
                    } else {
                        ToastUtil.show(mContext, "密码错误");
                        TipUtil.show(mContext, "密码错误");
                    }
                } catch (Exception e) {
                    CrashReport.postCatchedException(e);
app/src/main/java/com/dayu/recharge/view/TipDialog.java
New file
@@ -0,0 +1,91 @@
package com.dayu.recharge.view;
import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.TextView;
import com.dayu.recharge.R;
import com.dayu.recharge.utils.TipUtil;
/**
 * Created by Android Studio.
 * author: zuo
 * Date: 2023-11-22
 * Time: 9:12
 * 备注:
 */
public class TipDialog extends Dialog {
    Context mContext;
    EdtDialog.DialogBack mDialogBack;
    String mData;
    TipUtil.TipListener listener;
    public TipDialog(Context context, String data, TipUtil.TipListener tipListener) {
        super(context, R.style.ws_pay_showSelfDialog);
        mContext = context;
        mData = data;
        listener = tipListener;
        initView();
    }
    public TipDialog(Context context, String data) {
        super(context, R.style.ws_pay_showSelfDialog);
        mContext = context;
        mData = data;
        initView();
    }
    public TipDialog(Context context, EdtDialog.DialogBack dialogBack) {
        super(context, R.style.ws_pay_showSelfDialog);
        mContext = context;
        mDialogBack = dialogBack;
        initView();
    }
    private void initView() {
        getWindow().setGravity(Gravity.CENTER);
        setContentView(R.layout.text_dialog);
        setCanceledOnTouchOutside(false);
        final TextView editText = (TextView) this.findViewById(R.id.textData);
        editText.setText(mData);
        TextView cannel = (TextView) this.findViewById(R.id.cannel);
        cannel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onCancle();
                }
                TipDialog.this.dismiss();
            }
        });
    }
    @Override
    public void show() {
        super.show();
        /**
         * 设置宽度全屏,要设置在show的后面
         */
        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
        layoutParams.gravity = 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 DialogBack {
        void onOk(String data);
        void onCancel();
    }
}
app/src/main/res/layout/activity_admin_setup.xml
@@ -45,48 +45,8 @@
            </LinearLayout>
            <LinearLayout
                style="@style/newCardLL"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="管理员名称:"
                    android:textSize="@dimen/new_card_size" />
                <EditText
                    android:id="@+id/admin_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:maxLength="5"
                    android:textSize="@dimen/new_card_size" />
            </LinearLayout>
            <LinearLayout
                style="@style/newCardLL"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="电话:"
                    android:textSize="@dimen/new_card_size" />
                <EditText
                    android:id="@+id/admin_phone"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="number"
                    android:maxLength="11"
                    android:textSize="@dimen/new_card_size" />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/chose_address"
@@ -109,6 +69,24 @@
                    android:textSize="@dimen/new_card_size" />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/chose_address_code"
                style="@style/newCardLL"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="地址编码:"
                    android:textSize="@dimen/new_card_size" />
                <TextView
                    android:id="@+id/admin_address_code"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="@dimen/new_card_size" />
            </LinearLayout>
        </LinearLayout>
app/src/main/res/layout/activity_home.xml
@@ -25,7 +25,7 @@
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="新卡注册"
            android:text="新卡开户"
            android:textSize="@dimen/home_text_size" />
        <TextView
app/src/main/res/layout/activity_my.xml
@@ -56,7 +56,7 @@
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="管理员:"
                    android:text="地址信息:"
                    android:textSize="@dimen/text_size" />
                <TextView
app/src/main/res/layout/activity_new_card.xml
@@ -9,7 +9,7 @@
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_title_height"
        android:background="@drawable/title_bar_bg"
        app:centerText="新卡注册"
        app:centerText="新卡开户"
        app:leftImage="@mipmap/icon_back" />
    <ScrollView
@@ -163,7 +163,7 @@
        android:layout_alignParentBottom="true"
        android:background="@color/title_bg"
        android:gravity="center"
        android:text="注册"
        android:text="开户"
        android:textColor="#000000"
        android:textSize="@dimen/new_card_size" />
</RelativeLayout>
app/src/main/res/layout/activity_recharge.xml
@@ -12,44 +12,149 @@
        app:centerText="充值"
        app:leftImage="@mipmap/icon_back" />
    <ScrollView
    <LinearLayout
        android:id="@+id/recharge_read_LL"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/recharge_registBtn"
        android:layout_below="@+id/titleBar">
        android:layout_below="@+id/titleBar"
        android:orientation="vertical"
        android:visibility="visible">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="请将卡贴在设备上进行读卡"
            android:textSize="@dimen/text_size" />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/textView"
            android:scaleType="center"
            android:src="@mipmap/nfc_write" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/recharge_text_LL"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/titleBar"
        android:orientation="vertical"
        android:padding="20dp"
        android:visibility="gone">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="用户姓名:"
                android:textSize="@dimen/new_card_size" />
            <LinearLayout
                style="@style/newCardLL"
            <TextView
                android:id="@+id/userName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="金额(元):"
                    android:textSize="@dimen/new_card_size" />
                <EditText
                    android:id="@+id/recharge_water"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="numberDecimal"
                    android:textSize="@dimen/new_card_size" />
            </LinearLayout>
                android:layout_height="wrap_content"
                android:textSize="@dimen/new_card_size" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
    </ScrollView>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="用户注册编号:"
                android:textSize="@dimen/text_size" />
            <TextView
                android:id="@+id/red_initCode"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text=""
                android:textSize="@dimen/new_card_size" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="剩余金额:"
                android:textSize="@dimen/text_size" />
            <TextView
                android:id="@+id/red_remainder_blance"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/new_card_size" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="卡状态:"
                android:textSize="@dimen/text_size" />
            <TextView
                android:id="@+id/red_statu"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/new_card_size" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/recharge_LL"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/recharge_tx"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="金额(元):"
                android:textColor="@color/red"
                android:textSize="@dimen/new_card_size" />
            <EditText
                android:id="@+id/recharge_water"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="请输入充值的金额"
                android:inputType="numberDecimal"
                android:textSize="@dimen/new_card_size" />
        </LinearLayout>
    </LinearLayout>
    <TextView
        android:id="@+id/recharge_registBtn"
app/src/main/res/layout/activity_recharge_detail.xml
New file
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <com.dayu.recharge.view.TitleBar
        android:id="@+id/titleBar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_title_height"
        android:background="@drawable/title_bar_bg"
        app:centerText="写卡详情页"
        app:leftImage="@mipmap/icon_back" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="30dp">
        <TextView
            android:id="@+id/red_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="用户姓名:"
            android:textSize="@dimen/text_size" />
        <TextView
            android:id="@+id/red_initCode"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="用户注册编号:"
            android:textSize="@dimen/text_size" />
        <TextView
            android:id="@+id/red_remainder_morny"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="充值金额:"
            android:textSize="@dimen/text_size" />
        <TextView
            android:id="@+id/red_remainder_blance"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="剩余金额:"
            android:textSize="@dimen/text_size" />
        <TextView
            android:id="@+id/red_rechargeDate"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="本卡最后购水日期:"
            android:textSize="@dimen/text_size"
            android:visibility="gone" />
        <TextView
            android:id="@+id/red_rechargeNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="本卡充值次数:"
            android:textSize="@dimen/text_size"
            android:visibility="gone" />
        <TextView
            android:id="@+id/red_statu"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:text="卡状态:"
            android:textSize="@dimen/text_size" />
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/activity_red_card.xml
@@ -57,7 +57,8 @@
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:text="本卡最后购水日期:"
                android:textSize="@dimen/text_size" />
                android:textSize="@dimen/text_size"
                android:visibility="gone" />
            <TextView
                android:id="@+id/red_rechargeNumber"
@@ -65,7 +66,8 @@
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:text="本卡充值次数:"
                android:textSize="@dimen/text_size" />
                android:textSize="@dimen/text_size"
                android:visibility="gone" />
            <TextView
                android:id="@+id/red_statu"
app/src/main/res/layout/text_dialog.xml
New file
@@ -0,0 +1,54 @@
<?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="#00ffffff"
    android:gravity="center"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ws_pay_bg_dialog_top_stroke"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="20dp">
        <TextView
            android:id="@+id/textData"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:textColor="#000000"
            android:textSize="20sp" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/cannel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:background="@drawable/ws_login_red_btn_one"
                android:paddingLeft="15dp"
                android:paddingTop="5dp"
                android:paddingRight="15dp"
                android:paddingBottom="5dp"
                android:text="确认"
                android:textSize="@dimen/text_size" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
app/src/main/res/values/colors.xml
@@ -19,4 +19,5 @@
    <color name="date_picker_text_light">#59B29C</color>
    <color name="date_picker_text_dark">#333333</color>
    <color name="ws_pay_alpha">#00000000</color>
    <color name="red">#ff0000</color>
</resources>