左晓为主开发手持机充值管理机
zuoxiao
2024-09-10 f0de01d017c0ce0a4954dd1215449ceea05af29b
qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/RechargeActivity.java
@@ -1,6 +1,5 @@
package com.dayu.qiheonlinelibrary.activity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
@@ -10,23 +9,26 @@
import android.view.View;
import android.widget.EditText;
import com.dayu.baselibrary.tools.HexUtil;
import com.dayu.baselibrary.utils.DeviceUtils;
import com.dayu.baselibrary.utils.MornyUtil;
import com.dayu.baselibrary.utils.TipUtil;
import com.dayu.qiheonlinelibrary.QHOnLineApplication;
import com.dayu.qiheonlinelibrary.R;
import com.dayu.qiheonlinelibrary.bean.CardInfoResult;
import com.dayu.qiheonlinelibrary.bean.RechargeResult;
import com.dayu.qiheonlinelibrary.card.UserCard;
import com.dayu.qiheonlinelibrary.databinding.ActivityRechargeQhlBinding;
import com.dayu.qiheonlinelibrary.dbBean.AdminDataBean;
import com.dayu.qiheonlinelibrary.dbBean.ElectricPriceBean;
import com.dayu.qiheonlinelibrary.dbBean.UserCardBean;
import com.dayu.qiheonlinelibrary.dbBean.RechargeBean;
import com.dayu.qiheonlinelibrary.net.ApiManager;
import com.dayu.qiheonlinelibrary.net.BaseResponse;
import com.dayu.qiheonlinelibrary.net.subscribers.SubscriberListener;
import com.dayu.qiheonlinelibrary.tools.NfcReadHelper;
import com.dayu.qiheonlinelibrary.utils.CardCommon;
import com.tencent.bugly.crashreport.CrashReport;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
/**
@@ -42,13 +44,17 @@
    ActivityRechargeQhlBinding binding;
    public static RechargeActivity rechargeActivity;
    AdminDataBean adminData;
    String userName;
    String cardNumber = null;
    UserCardBean userCardBean;
    int waterPrice;
    String cardNumber = null;//实体卡号
    RechargeBean rechargeBean;
    String rechageWater;//充值的水量
    ElectricPriceBean priceBean;
    String cardType;//卡状态
    CardInfoResult cardInfoResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
@@ -58,7 +64,6 @@
            setContentView(binding.getRoot());
            setPricePoint(binding.rechargeWater);
            rechargeActivity = this;
            waterPrice = baseDao.adminDao().findFirst().getWaterPrice();
            initView();
        } catch (Exception e) {
            e.printStackTrace();
@@ -79,129 +84,83 @@
    private void readAllData() {
        String cardType = NfcReadHelper.getInstence(intent, this).getCradTypeAndCardNumber();
        cardType = NfcReadHelper.getInstence(intent, this).getCradTypeAndCardNumber();
        String[] cardTypes = cardType.split(",");
        if (cardTypes != null && cardTypes.length == 2) {
            cardNumber = cardType.split(",")[0];
            cardNumber = HexUtil.spaceHex(cardNumber);
            cardNumber = HexUtil.HighLowHex(cardNumber);
            cardType = cardType.split(",")[1];
        }
        List<byte[]> data = NfcReadHelper.getInstence(intent, this).getOnesectorData();
        if (!data.isEmpty()) {
            if (!TextUtils.isEmpty(cardNumber)) {
                setUserData(cardType, cardNumber, data);
                if(priceBean!=null){
                    binding.redRechargeElectric.setText("电量单价:"+priceBean.getPrice()+"元/度");
                }
            } else {
                TipUtil.show(this, "读取卡片失败,请重新贴卡");
        //获取卡内信息
        userCard = NfcReadHelper.getInstence(intent, this).getUserCardData();
        if (userCard != null) {
            try {
                getUserInfoAndCardInfo(cardNumber, userCard.getMyUserCode());
            } catch (Exception e) {
                e.printStackTrace();
                CrashReport.postCatchedException(e);
                TipUtil.show(this, "读卡失败,请刷卡后不要立即移开");
            }
        } else {
            TipUtil.show(this, "卡片识别错误,请重试!");
            TipUtil.show(this, "读卡失败,请刷卡后不要立即移开");
        }
    }
    @SuppressLint("ResourceAsColor")
    private void setUserData(String cardType, String cardNumber, List<byte[]> data) {
        String state = "";
    private void setUserData(String cardNumber, String userName, String lastRechargeTime) {
        if (cardType.equalsIgnoreCase(CardCommon.USER_CARD_TYPE_1)) {
            state = "终端写卡";
            setCardState("终端写卡");
            binding.rechargeLL.setVisibility(View.VISIBLE);
            binding.rechargeRegistBtn.setVisibility(View.VISIBLE);
            binding.redStatu.setTextColor(R.color.black);
            binding.redStatu.setTextColor(this.getResources().getColor(R.color.black));
        } else if (cardType.equalsIgnoreCase(CardCommon.USER_CARD_TYPE_2)) {
            state = "未刷卡关泵,当前不可充值";
            binding.rechargeLL.setVisibility(View.GONE);
            binding.rechargeRegistBtn.setVisibility(View.GONE);
            binding.redStatu.setTextColor(com.dayu.baselibrary.R.color.red);
            setCardState("未刷卡关泵,当前不可充值");
            TipUtil.show(RechargeActivity.this, "未刷卡关泵,当前不可充值");
        } else if (cardType.equalsIgnoreCase(CardCommon.USER_CARD_TYPE_3)) {
            state = "叠加充值";
            binding.rechargeLL.setVisibility(View.GONE);
            binding.rechargeRegistBtn.setVisibility(View.GONE);
            setCardState("叠加充值");
        } else {
            TipUtil.show(this, "非用户卡,不能充值");
            return;
        }
        if (userCard != null) {
            try {
                if (Integer.valueOf(QHOnLineApplication.getInstance().arerNumber) == userCard.getArerNumber()) {
                    binding.rechargeReadLL.setVisibility(View.GONE);
                    binding.rechargeTextLL.setVisibility(View.VISIBLE);
                    binding.userName.setText(userName);
                    binding.redInitCode.setText(cardNumber);
                    binding.redRechargeDate.setText("本卡最后购水日期:\n\n" + lastRechargeTime);
                    binding.redUserCode.setText(cardInfoResult.getIccardCode());
                    if (userCard != null) {
                        binding.redRemainderBlance.setText(MornyUtil.changeF2Y(userCard.getBalance()) + " 元");
                        binding.redBalanceElectric.setText("充值后剩余电量:" + MornyUtil.changeF2Y(userCard.getSurplusElecticity()) + " 度");
                    }
                    binding.redRechargeElectric.setText("电量单价:" + QHOnLineApplication.getInstance().electriclePriceStr + "元/度");
        userCard = UserCard.getBean(data);
        List<UserCardBean> userCardBeans = baseDao.userCardDao().findUserName(cardNumber);
        AdminDataBean adminDataBean = baseDao.adminDao().findFirst();
        if (Integer.valueOf(adminDataBean.getAddressCode()) == userCard.getArerNumber()) {
            if (!userCardBeans.isEmpty()) {
                userCardBean = userCardBeans.get(0);
                this.userName = userCardBean.getUserName();
            } else {
                userCardBean = new UserCardBean();
                userCardBean.setCardNumber(cardNumber);
                userCardBean.setUserName("未知用户");
                userCardBean.setPhone("未知");
                userCardBean.setUserID("未知");
                userCardBean.setAddressCode(String.valueOf(userCard.getArerNumber()));
                userCardBean.setSerial(String.valueOf(userCard.getArerNumber()));
                this.userName = "未知用户";
            }
            binding.rechargeReadLL.setVisibility(View.GONE);
            binding.rechargeTextLL.setVisibility(View.VISIBLE);
            binding.userName.setText(userName);
            binding.redStatu.setText(state);
            if (userCard != null) {
                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);
                    binding.redRechargeDate.setText("本卡最后购水日期:" + year + "年" + month + "月" + day + "日");
                } else {
                    binding.redRechargeDate.setText("本卡最后购水日期:无");
                    TipUtil.show(this, "非本区域卡\n不能充值!!!");
                }
                binding.redInitCode.setText(cardNumber);
//                binding.redRechargeNumber.setText("本卡充值次数:" + userCard.getRechargeTimes() + " 次");
//                binding.redTotalWater.setText("总用水量:" + MornyUtil.changeF2Y(userCard.getTotalWater()) + " 吨");
//                binding.redTotalPower.setText("总用电量:" + MornyUtil.changeF2Y(userCard.getTotalElectric()) + " 度");
                binding.redRemainderBlance.setText(MornyUtil.changeF2Y(userCard.getBalance()) + " 元");
                binding.redRemainderWater.setText("剩余水量:" + MornyUtil.changeF2Y(userCard.getSurplusWater()) + " 吨");
//                binding.redWaterPrice.setText("每立方米水价格:" + MornyUtil.changeF2Y(adminData.getWaterPrice()) + " 元");
            } catch (Exception e) {
                e.printStackTrace();
                CrashReport.postCatchedException(e);
                TipUtil.show(this, "读卡失败,请刷卡后不要立即移开");
            }
        } else {
            TipUtil.show(this, "非本区域卡\n不能充值!!!");
            TipUtil.show(this, "读卡失败,请刷卡后不要立即移开");
        }
    }
    private void initView() {
        try {
            adminData = baseDao.adminDao().findFirst();
            priceBean = baseDao.electricPriceDao().findFirst();
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
        binding.rechargeRegistBtn.setOnClickListener(v -> {
            String morny = binding.rechargeWater.getText().toString();
            if (!TextUtils.isEmpty(morny)) {
                Intent intent = new Intent(RechargeActivity.this, NFCWreatActivity.class);
                //当前金额单位为元
                intent.putExtra("morny", morny);
                intent.putExtra("userName", userName);
                intent.putExtra("cardNumber", cardNumber);
                intent.putExtra("userCard", userCard);
                intent.putExtra("userCardBean", userCardBean);
//                intent.putExtra("rechageWater", rechageWater);
                startActivity(intent);
                rechaege(morny);
            } else {
                TipUtil.show(RechargeActivity.this, "请输入充值金额(元)");
                TipUtil.show(RechargeActivity.this, "请输入充值金额");
            }
        });
    }
@@ -236,7 +195,7 @@
                }
                String morny = editText.getText().toString();
                if (!TextUtils.isEmpty(morny)) {
                    rechageWater = MornyUtil.intDiv(MornyUtil.changeY2F(editText.getText().toString()), waterPrice);
//                    rechageWater = MornyUtil.intDiv(MornyUtil.changeY2F(editText.getText().toString()), waterPrice);
//                    binding.redRechargeWater.setText("充值水量:" + rechageWater + " 立方米(吨)");
                }
@@ -264,4 +223,161 @@
        super.onDestroy();
        rechargeActivity = null;
    }
    private void startNfcActivity(String morny, String balance, float rechargeElectric, float iccardBalanceElectric, float totalMorny, String iccardRechargeRecordId) {
        //先处理补扣
        //充值补扣金额=充值金额+充值前读取的卡内余额-充值回调返回卡内余额
        int deductionMorny = MornyUtil.changeY2F(morny) + userCard.getBalance() - MornyUtil.changeY2F(balance);
        if (MornyUtil.changeY2F(morny) < deductionMorny) {
            TipUtil.show(RechargeActivity.this, "当前充值金额小于补扣金额,补扣金额为" + MornyUtil.changeF2Y(deductionMorny) + "元,充值金额应大于补扣金额!");
            return;
        }
        //添加充值信息
        rechargeBean = new RechargeBean();
        rechargeBean.setCardNumber(cardNumber);
        rechargeBean.setUserCode(userCard.getUserCode() + userCard.getUserCodeNumber());
        rechargeBean.setUserName(cardInfoResult.getPeasantName());
        rechargeBean.setPersonId(cardInfoResult.getPeasantId());
        rechargeBean.setSerial(DeviceUtils.getSN());
        rechargeBean.setArerNumber(QHOnLineApplication.getInstance().arerNumber);
        rechargeBean.setMorny(morny);
        rechargeBean.setBalance(balance);
        rechargeBean.setRechargeElectric(String.valueOf(rechargeElectric));
        rechargeBean.setPrice(QHOnLineApplication.getInstance().electriclePriceStr);
        rechargeBean.setSurplusElectic(String.valueOf(iccardBalanceElectric));
        long time = System.currentTimeMillis();
        rechargeBean.setRechargeDate(time);
        rechargeBean.setUserId("");
        rechargeBean.setTotalMorny(String.valueOf(totalMorny));
        rechargeBean.setState(1);
        rechargeBean.setOrderId(iccardRechargeRecordId);
        rechargeBean.setDeductionMorny(MornyUtil.changeF2Y(deductionMorny));
        rechargeBean.setAdminId(QHOnLineApplication.getInstance().adminId);
        userCard.setCardWriteState(0);
        userCard.setCardState(1);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(time);
        userCard.setBalance(MornyUtil.changeY2F(String.valueOf(balance)));
        userCard.setSurplusElecticity(MornyUtil.changeY2F(String.valueOf(iccardBalanceElectric)));
        userCard.setTotalMorny(MornyUtil.changeY2F(String.valueOf(totalMorny)));
        userCard.setRechargeDate(calendar);
        userCard.setElectricPrice(Float.valueOf(QHOnLineApplication.getInstance().electriclePriceStr));
        if (deductionMorny == 0) {
            Intent intent = new Intent(RechargeActivity.this, NFCWreatActivity.class);
            intent.putExtra("morny", morny);
            intent.putExtra("userCard", userCard);
            intent.putExtra("rechargeBean", rechargeBean);
            startActivity(intent);
        } else {
            TipUtil.show(RechargeActivity.this, "挂失卡后有补交金额!补交金额为:" + MornyUtil.changeF2Y(deductionMorny) + "元,详情可在平台查询。", new TipUtil.TipListener() {
                @Override
                public void onCancle() {
                    Intent intent = new Intent(RechargeActivity.this, NFCWreatActivity.class);
                    intent.putExtra("morny", morny);
                    intent.putExtra("userCard", userCard);
                    intent.putExtra("rechargeBean", rechargeBean);
                    startActivity(intent);
                }
            });
        }
    }
    /**
     * IC卡充值
     *
     * @param morny
     */
    public void rechaege(String morny) {
        Map<String, Object> data = new HashMap<>();
        //终端设备号
        data.put("equipCode", DeviceUtils.getSN());
        //ic卡信息id
        data.put("iccardNum", cardNumber);
        //交易水费金额(元)
        data.put("rechargeWaterMoney", morny);
        //卡内剩余金额(元)
        data.put("iccardBalanceMoney", MornyUtil.changeF2Y(userCard.getBalance()));
        //卡内剩余水量(m³)
        data.put("iccardBalanceAmonunt", "0");
        //卡内剩余电量
        data.put("iccardBalanceElectric", MornyUtil.changeF2Y(userCard.getSurplusElecticity()));
        ApiManager.getInstance().requestPostLoading(this, "iccard/recharge/rechargeCard", RechargeResult.class, data, new SubscriberListener<BaseResponse<RechargeResult>>() {
            @Override
            public void onNext(BaseResponse<RechargeResult> t) {
                if (t.isSuccess()) {
                    if (t.getData() != null) {
                        RechargeResult rechargeResult = t.getData();
                        startNfcActivity(morny, rechargeResult.getIccardBalanceMoney(), rechargeResult.getRechargeElectricAmount(), rechargeResult.getIccardBalanceElectric(), rechargeResult.getTotalRechargeMoney(), rechargeResult.getIccardRechargeRecordId());
                    } else {
                        TipUtil.show(RechargeActivity.this, "充值失败请重试!");
                    }
                } else {
                    TipUtil.show(RechargeActivity.this, t.getMsg());
                }
            }
        });
    }
    /**
     * 获取卡信息和用户信息
     *
     * @param iccardCode
     */
    public void getUserInfoAndCardInfo(String iccardNum, String iccardCode) {
        Map<String, Object> data = new HashMap<>();
        //ic卡信息id
        data.put("iccardNum", iccardNum);
        data.put("iccardCode", iccardCode);
        ApiManager.getInstance().requestPostLoading(this, "iccard/peasant/getIccardInfoVoByCardCode", CardInfoResult.class, data, new SubscriberListener<BaseResponse<CardInfoResult>>() {
            @Override
            public void onNext(BaseResponse<CardInfoResult> t) {
                String state = "";
                if (t.isSuccess()) {
                    if (t.getData() != null) {
                        //ic卡状态 0 正常 1 已注销 2 已挂失
                        if (t.getData().getIccardStatus() == 0) {
//                            List<byte[]> data = NfcReadHelper.getInstence(intent, RechargeActivity.this).getOnesectorData();
                            if (!data.isEmpty()) {
                                if (!TextUtils.isEmpty(cardNumber)) {
                                    cardInfoResult = t.getData();
                                    setUserData(cardNumber, cardInfoResult.getPeasantName(), cardInfoResult.getLastRechargeTime());
                                } else {
                                    TipUtil.show(RechargeActivity.this, "读取卡片失败,请重新贴卡");
                                }
                            } else {
                                TipUtil.show(RechargeActivity.this, "卡片识别错误,请重试!");
                            }
                        } else if (t.getData().getIccardStatus() == 1) {
                            TipUtil.show(RechargeActivity.this, "当前卡已注销");
                        } else {
                            TipUtil.show(RechargeActivity.this, "当前卡已挂失");
                        }
                    } else {
                        TipUtil.show(RechargeActivity.this, "当前卡片错误,未能查到该卡信息!");
                    }
                } else {
                    TipUtil.show(RechargeActivity.this, t.getMsg());
                }
            }
        });
    }
    private void setCardState(String state) {
        binding.rechargeLL.setVisibility(View.GONE);
        binding.rechargeRegistBtn.setVisibility(View.GONE);
        binding.redStatu.setTextColor(RechargeActivity.this.getResources().getColor(com.dayu.baselibrary.R.color.red));
        binding.redStatu.setText(state);
    }
}