PayViewModel.java 17.6 KB
package com.naji.xiaotao.pay.vm;

import android.content.Context;
import android.content.Intent;
import android.databinding.ObservableArrayList;
import android.databinding.ObservableField;
import android.databinding.ObservableFloat;
import android.databinding.ObservableInt;
import android.databinding.ObservableList;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.SparseIntArray;
import android.view.View;
import android.widget.Toast;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.naji.xiaotao.BR;
import com.naji.xiaotao.R;
import com.naji.xiaotao.cart.entity.OrderEntity;
import com.naji.xiaotao.cart.vm.CartItemViewModel;
import com.naji.xiaotao.common.dialog.RightDialog;
import com.naji.xiaotao.history.service.HistoryApiService;
import com.naji.xiaotao.history.ui.HistoryActivity;
import com.naji.xiaotao.http.RetrofitClient;
import com.naji.xiaotao.pay.entity.PaymentEntity;
import com.naji.xiaotao.pay.service.PayApiService;
import com.naji.xiaotao.pay.ui.HyyhDialog;
import com.naji.xiaotao.pay.ui.PayActivity;
import com.naji.xiaotao.pay.ui.ZddzActivity;
import com.naji.xiaotao.pay.ui.ZdyyhActivity;
import com.naji.xiaotao.tangshi.ui.TangShiActivity;
import com.naji.xiaotao.util.DialogUtil;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.base.BaseViewModel;
import me.goldze.mvvmhabit.base.TitleViewModel;
import me.goldze.mvvmhabit.binding.command.BindingAction;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.binding.command.BindingConsumer;
import me.goldze.mvvmhabit.bus.Messenger;
import me.goldze.mvvmhabit.http.BaseResponse;
import me.goldze.mvvmhabit.http.ResponseThrowable;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.MaterialDialogUtils;
import me.goldze.mvvmhabit.utils.RxUtils;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;
import me.tatarka.bindingcollectionadapter2.ItemBinding;
import me.tatarka.bindingcollectionadapter2.OnItemBind;

public class PayViewModel extends BaseViewModel{

    public static final String TOKEN_SELECT_ITEM="token_slect_item";
    public static final String TOKEN_ZDDZ="token_zddz";//整单打折
    public static final String TOKEN_ZDYYH="token_zdyyh";//自定义优惠

    public ObservableField<String> countPrice=new ObservableField<>();//订单金额
    public ObservableField<String> lastPrice=new ObservableField<>();//应收金额
    private String paymentid;//支付方式id

    public ObservableField<String> payment=new ObservableField<>();//支付方式
    public ObservableInt paymentVisibility=new ObservableInt(View.GONE);//支付结账显示隐藏
    public ObservableInt yhIndex=new ObservableInt(-1);//选中的优惠index

    private OnItemSelectListener onItemSelectListener;

    public TitleViewModel titleViewModel;

    private String orderid;//订单id
    private float memberPrice;//会员价格

    public ObservableInt youhuiVisibility=new ObservableInt(View.GONE);
    public ObservableField<String> youhuiTitle=new ObservableField<>();//优惠方式
    public ObservableField<String> youhuiMoney=new ObservableField<>();//优惠金额
    public ObservableField<String> zhe=new ObservableField<>();//折
    public ObservableInt zheVisibility=new ObservableInt();//折是否可见
    private String reason;//优惠说明

    private String reverseReason;//反结账原因

    public PayViewModel(Context context,List<PaymentEntity> payLists,float countPrice,float memberPrice,String orderid,String reverseReason,OnItemSelectListener onItemSelectListener){
        super(context);
        titleViewModel=new TitleViewModel(context,"结账");
        String all= new DecimalFormat("##0.00").format(countPrice);
        this.countPrice.set(all);
        this.memberPrice=memberPrice;
        this.lastPrice.set(all);
        this.orderid=orderid;
        this.reverseReason=reverseReason;
        this.onItemSelectListener=onItemSelectListener;
    }

    public interface OnItemSelectListener{
        void onItemSelect(int type,int position);//type 0优惠方式 1收款方式
    }

    @Override
    public void onCreate() {
        super.onCreate();
        getPayList();
    }

    @Override
    public void registerRxBus() {
        super.registerRxBus();
        Messenger.getDefault().register(context, TOKEN_SELECT_ITEM, PayItemViewModel.class, new BindingConsumer<PayItemViewModel>() {
            @Override
            public void call(PayItemViewModel payItemViewModel) {
                paymentid=payItemViewModel.entity.getId();
                payment.set(payItemViewModel.entity.getPayment()+"记账");
                paymentVisibility.set(View.VISIBLE);
                if(onItemSelectListener!=null){
                    for(int i=0;i<payObservableList.size();i++){
                        PayItemViewModel viewModel=payObservableList.get(i);
                        if(i==Integer.parseInt(payItemViewModel.entity.getTag())){
                            viewModel.entity.setSelected(true);
                        }else{
                            viewModel.entity.setSelected(false);
                        }
                    }
                    onItemSelectListener.onItemSelect(1,Integer.parseInt(payItemViewModel.entity.getTag()));
                }
            }
        });
        //账单打折
        Messenger.getDefault().register(context, TOKEN_ZDDZ, ZddzViewModel.class, new BindingConsumer<ZddzViewModel>() {
            @Override
            public void call(ZddzViewModel zddzViewModel) {
                yhIndex.set(0);
                youhuiTitle.set("整单打折");
                zhe.set(zddzViewModel.zhe.get()+"折");
                zheVisibility.set(View.VISIBLE);
                reason=zddzViewModel.reason.get();
                float last_money=Float.parseFloat(countPrice.get())*(Float.parseFloat(zddzViewModel.zhe.get())/10);
                String last_money_str=new DecimalFormat("##0.00").format(last_money);
                lastPrice.set(last_money_str);
                Float youhui_money=Float.parseFloat(countPrice.get())-Float.parseFloat(countPrice.get())*(Float.parseFloat(zddzViewModel.zhe.get())/10);
                String money=new DecimalFormat("##0.00").format(youhui_money);
                youhuiMoney.set("-¥"+money);
                youhuiVisibility.set(View.VISIBLE);
            }
        });
        //自定义优惠
        Messenger.getDefault().register(context, TOKEN_ZDYYH, ZdyyhViewModel.class, new BindingConsumer<ZdyyhViewModel>() {
            @Override
            public void call(ZdyyhViewModel zdyyhViewModel) {
                yhIndex.set(2);
                youhuiTitle.set("自定义优惠");
                reason=zdyyhViewModel.youhuiReason.get();
                zheVisibility.set(View.INVISIBLE);
                float last_money=Float.parseFloat(countPrice.get())-Float.parseFloat(zdyyhViewModel.youhuiMoney.get());
                String last_money_str=new DecimalFormat("##0.00").format(last_money);
                lastPrice.set(last_money_str);
                Float youhui_money=Float.parseFloat(zdyyhViewModel.youhuiMoney.get());
                String money=new DecimalFormat("##0.00").format(youhui_money);
                youhuiMoney.set("-¥"+money);
                youhuiVisibility.set(View.VISIBLE);
            }
        });
    }

    //优惠撤销
    public BindingCommand youhuiCancel=new BindingCommand(new BindingAction() {
        @Override
        public void call() {
            youhuiVisibility.set(View.GONE);
            yhIndex.set(-1);
            lastPrice.set(countPrice.get());
        }
    });

    public ObservableList<PayItemViewModel> payObservableList=new ObservableArrayList<>();
    public ItemBinding<PayItemViewModel> payItemBinding=ItemBinding.of(BR.viewModel,R.layout.layout_pay_item);

    //支付商家支持支付方式
    private void getPayList(){
        Map<String,String> params=new HashMap<>();
        params.put("sellerid", SPUtils.getInstance("user_info").getString("sellerid"));
        RetrofitClient.getInstance().create(PayApiService.class)
                .getPaymentList(params)
                .compose(RxUtils.schedulersTransformer())
                .compose(RxUtils.exceptionTransformer())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        showDialog();
                    }
                })
                .subscribe(new Consumer<BaseResponse<List<List<PaymentEntity>>>>() {
                    @Override
                    public void accept(BaseResponse<List<List<PaymentEntity>>> listBaseResponse) throws Exception {
                        dismissDialog();
                        if (listBaseResponse.getRet()==200){
                            payObservableList.clear();
                            for(int i=0;i<listBaseResponse.getData().get(0).size();i++){
                                PaymentEntity entity=listBaseResponse.getData().get(0).get(i);
                                entity.setTag(String.valueOf(i));;
                                payObservableList.add(new PayItemViewModel(context,entity));
                            }
                        }
                    }
                }, new Consumer<ResponseThrowable>() {
                    @Override
                    public void accept(ResponseThrowable responseThrowable) throws Exception {
                        dismissDialog();
                        responseThrowable.printStackTrace();
                        ToastUtils.showShort(responseThrowable.msg);
                    }

                });
    }

    //整单打折
    public BindingCommand OnZddzClickCommand=new BindingCommand(new BindingAction() {
        @Override
        public void call() {
            Bundle bundle=new Bundle();
            bundle.putString("count_price",countPrice.get());
            startActivity(ZddzActivity.class,bundle);
        }
    });
    //会员优惠
    public BindingCommand OnHyyhClickCommand=new BindingCommand(new BindingAction() {
        @Override
        public void call() {
            HyyhDialog dialog=new HyyhDialog();
            dialog.setCallback(new HyyhDialog.OnSureCallback() {
                @Override
                public void onSureClick() {
                    yhIndex.set(1);
                    youhuiTitle.set("会员优惠");
                    zheVisibility.set(View.INVISIBLE);
                    String last_money_str=new DecimalFormat("##0.00").format(memberPrice);
                    lastPrice.set(last_money_str);
                    Float youhui_money=Float.parseFloat(countPrice.get())-memberPrice;
                    String money=new DecimalFormat("##0.00").format(youhui_money);
                    youhuiMoney.set("-¥"+money);
                    youhuiVisibility.set(View.VISIBLE);
                }
            });
            dialog.show(((AppCompatActivity)context).getSupportFragmentManager(),"HyyhDialog");
        }
    });
    //自定义优惠
    public BindingCommand OnZdyyhClickCommand=new BindingCommand(new BindingAction() {
        @Override
        public void call() {
            Bundle bundle=new Bundle();
            bundle.putString("count_price",countPrice.get());
            startActivity(ZdyyhActivity.class,bundle);
        }
    });


    //支付方式撤销
    public BindingCommand paymentCancelCommand=new BindingCommand(new BindingAction() {
        @Override
        public void call() {
            paymentid="";
            paymentVisibility.set(View.GONE);
            if(onItemSelectListener!=null){
                onItemSelectListener.onItemSelect(1,-1);
            }
        }
    });

    //结账
    public BindingCommand onPayClickCommand=new BindingCommand(new BindingAction() {
        @Override
        public void call() {
            checkoutOrder();
        }
    });

    //结账
    private void checkoutOrder(){
        if(TextUtils.isEmpty(paymentid)){
            MaterialDialogUtils.showBasicDialogNoCancel(context,"提示","请选择记账方式").build().show();
            return;
        }
        Map<String,String> params=new HashMap<>();
        params.put("sellerid",SPUtils.getInstance("user_info").getString("sellerid"));
        params.put("orderid",orderid);
        params.put("paymentid",paymentid);
        params.put("price",countPrice.get());//订单金额
        params.put("receivable_price",lastPrice.get());//应付金额
        if(yhIndex.get()!=-1){
            params.put("discount_type",yhIndex.get()+"");//优惠方式 0:整单折扣  1:会员优惠 2:自定义
            if(yhIndex.get()==0||yhIndex.get()==2){
                params.put("discount_desc",TextUtils.isEmpty(reason)?"":reason);//优惠说明
            }
            if(yhIndex.get()==0){
                params.put("discount",zhe.get().substring(0,zhe.get().length()-1));//折扣
            }
            params.put("discount_price",youhuiMoney.get().substring(2));//优惠金额
        }

        RetrofitClient.getInstance().create(PayApiService.class)
                .checkoutOrder(params)
                .compose(RxUtils.schedulersTransformer())
                .compose(RxUtils.exceptionTransformer())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        showDialog();
                    }
                })
                .subscribe(new Consumer<BaseResponse<List<String>>>() {
                    @Override
                    public void accept(BaseResponse<List<String>> listBaseResponse) throws Exception {
                        if(listBaseResponse.getRet()==200){
                            if(TextUtils.isEmpty(reverseReason)){
                                dismissDialog();
                                final RightDialog dialog=new RightDialog();
                                Bundle bundle=new Bundle();
                                bundle.putString("msg","结账成功");
                                dialog.setArguments(bundle);
                                new Handler().postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        dialog.dismiss();
                                        startActivity(TangShiActivity.class);
                                    }
                                }, 1000);
                                dialog.show(((AppCompatActivity)context).getSupportFragmentManager(),"rightDialog");
                            }else{
                                backOrderPay();
                            }
                        }else{
                            ToastUtils.showShort(listBaseResponse.getMsg());
                        }
                    }
                }, new Consumer<ResponseThrowable>() {
                    @Override
                    public void accept(ResponseThrowable throwable) throws Exception {
                        dismissDialog();
                        throwable.printStackTrace();
                        ToastUtils.showShort(throwable.msg);
                    }
                });
    }

    //反结账
    private void backOrderPay(){
        Map<String,String> params=new HashMap<>();
        params.put("orderid",orderid);
        params.put("back_desc",reverseReason);
        RetrofitClient.getInstance().create(HistoryApiService.class)
                .backOrderPay(params)
                .compose(RxUtils.schedulersTransformer())
                .compose(RxUtils.exceptionTransformer())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {

                    }
                })
                .subscribe(new Consumer<BaseResponse<List<String>>>() {
                    @Override
                    public void accept(BaseResponse<List<String>> listBaseResponse) throws Exception {
                        dismissDialog();
                        if(listBaseResponse.getRet()==200){
                            final RightDialog dialog=new RightDialog();
                            Bundle bundle=new Bundle();
                            bundle.putString("msg","反结账成功");
                            dialog.setArguments(bundle);
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    dialog.dismiss();
                                    startActivity(HistoryActivity.class);
                                }
                            }, 1000);
                            dialog.show(((AppCompatActivity)context).getSupportFragmentManager(),"rightDialog");
                        }else{
                            ToastUtils.showShort(listBaseResponse.getMsg());
                        }
                    }

                }, new Consumer<ResponseThrowable>() {
                    @Override
                    public void accept(ResponseThrowable responseThrowable) throws Exception {
                        dismissDialog();
                        responseThrowable.printStackTrace();
                        ToastUtils.showShort(responseThrowable.msg);
                    }
                });
    }

}