From 4bd00098f7c5519756cb792f84b08bf0c873e7f5 Mon Sep 17 00:00:00 2001 From: wushaocheng <15876365887@163.com> Date: Wed, 23 Nov 2022 00:23:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=91=E6=8D=A2=E5=92=8C=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yizhuan/erban/earn/EarnRecordViewModel.kt | 60 +++++++++ .../earn/activity/ConvertDiamondActivity.kt | 101 +++++++++++++- .../erban/earn/activity/EarnRecordActivity.kt | 8 +- .../earn/activity/EarnWithdrawActivity.kt | 126 +++++++++++++++++- .../res/layout/activity_convert_diamond.xml | 1 + .../main/res/layout/activity_earn_record.xml | 1 + .../res/layout/activity_earn_withdraw.xml | 69 +++++++--- .../main/res/layout/fragment_recommend.xml | 4 +- app/src/main/res/values/strings.xml | 4 + .../earn/bean/ConfigWithdrawInfo.kt | 13 ++ .../earn/bean/GoldToDiamondInfo.kt | 4 +- .../earn/bean/WithdrawAccount.kt | 15 +++ .../earn/model/EarnModel.kt | 47 +++++++ .../common/util/DoubleUtils.java | 99 ++++++++++++++ 14 files changed, 522 insertions(+), 30 deletions(-) create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/ConfigWithdrawInfo.kt create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/WithdrawAccount.kt create mode 100644 library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/DoubleUtils.java diff --git a/app/src/main/java/com/yizhuan/erban/earn/EarnRecordViewModel.kt b/app/src/main/java/com/yizhuan/erban/earn/EarnRecordViewModel.kt index a259e707b..0405cf106 100644 --- a/app/src/main/java/com/yizhuan/erban/earn/EarnRecordViewModel.kt +++ b/app/src/main/java/com/yizhuan/erban/earn/EarnRecordViewModel.kt @@ -2,19 +2,34 @@ package com.yizhuan.erban.earn import androidx.lifecycle.MutableLiveData import com.yizhuan.erban.base.BaseViewModel +import com.yizhuan.xchat_android_core.earn.bean.ConfigWithdrawInfo import com.yizhuan.xchat_android_core.earn.bean.EarnRecordInfo import com.yizhuan.xchat_android_core.earn.bean.GoldToDiamondInfo import com.yizhuan.xchat_android_core.earn.model.EarnModel +import com.yizhuan.xchat_android_core.utils.toast class EarnRecordViewModel : BaseViewModel() { //收益记录 private val _earnRecordLiveData = MutableLiveData() val earnRecordLiveData: MutableLiveData = _earnRecordLiveData + //金币兑换钻石 private val _goldToDiamondLiveData = MutableLiveData() val goldToDiamondLiveData: MutableLiveData = _goldToDiamondLiveData + //金币兑换钻石-确认 + private val _exchangeConfirmLiveData = MutableLiveData() + val exchangeConfirmLiveData: MutableLiveData = _exchangeConfirmLiveData + + //提现界面 + private val _getConfigWithdrawLiveData = MutableLiveData() + val getConfigWithdrawLiveData: MutableLiveData = _getConfigWithdrawLiveData + + //提现 + private val _exchangeLiveData = MutableLiveData() + val exchangeLiveData: MutableLiveData = _exchangeLiveData + /** * 收益记录 */ @@ -45,4 +60,49 @@ class EarnRecordViewModel : BaseViewModel() { ) } + /** + * 金币兑换钻石-确认 + */ + fun exchangeConfirm( + goldNum: Long, + diamondNum: Long, + currency: Int + ) { + safeLaunch( + true, + block = { + _exchangeConfirmLiveData.value = + EarnModel.exchangeConfirm(goldNum, diamondNum, currency) + } + ) + } + + /** + * 提现界面 + */ + fun getConfigWithdraw() { + safeLaunch( + true, + block = { + _getConfigWithdrawLiveData.value = EarnModel.getConfigWithdrawInfo() + } + ) + } + + /** + * 提现 + */ + fun exchange(goldNum: Long, payPwd: String) { + safeLaunch( + true, + onError = { + it.message.toast() + _exchangeLiveData.value = null + }, + block = { + _exchangeLiveData.value = EarnModel.exchange(goldNum, payPwd) + } + ) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/earn/activity/ConvertDiamondActivity.kt b/app/src/main/java/com/yizhuan/erban/earn/activity/ConvertDiamondActivity.kt index d8f988c87..16b1bc1de 100644 --- a/app/src/main/java/com/yizhuan/erban/earn/activity/ConvertDiamondActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/earn/activity/ConvertDiamondActivity.kt @@ -4,11 +4,16 @@ import android.content.Context import android.content.Intent import android.text.Editable import android.text.TextWatcher +import androidx.activity.viewModels import com.netease.nim.uikit.StatusBarUtil import com.yizhuan.erban.R import com.yizhuan.erban.base.BaseViewBindingActivity import com.yizhuan.erban.databinding.ActivityConvertDiamondBinding +import com.yizhuan.erban.earn.EarnRecordViewModel import com.yizhuan.xchat_android_core.earn.bean.GoldToDiamondInfo +import com.yizhuan.xchat_android_library.common.util.DoubleUtils +import kotlin.math.ceil +import kotlin.math.floor /** * author: wushaocheng @@ -17,6 +22,11 @@ import com.yizhuan.xchat_android_core.earn.bean.GoldToDiamondInfo */ class ConvertDiamondActivity : BaseViewBindingActivity() { + private val earnRecordModel: EarnRecordViewModel by viewModels() + + private var isGold = false + private var isDiamond = false + companion object { const val BEAN = "bean" @@ -30,13 +40,19 @@ class ConvertDiamondActivity : BaseViewBindingActivity + isGold = b + } + binding.edDiamond.setOnFocusChangeListener { view, b -> + isDiamond = b + } + binding.edGold.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { } @@ -46,11 +62,30 @@ class ConvertDiamondActivity : BaseViewBindingActivity + if (loading) dialogManager.showProgressDialog(this) + else dialogManager.dismissDialog() + } + + earnRecordModel.exchangeConfirmLiveData.observe(this) { + toast(getString(R.string.exchange_success)) + finish() + } + + binding.tvConvert.setOnClickListener { view -> + if (binding.edDiamond.text.toString().toLong() < it.minDiamonds) { + toast("至少需要兌換${it.minDiamonds}鉆石") + } else if (binding.edDiamond.text.toString().toLong() > it.maxDiamonds) { + toast("兌換鉆石數不能超過${it.maxDiamonds}鉆") + } else { + if (isDiamond) { + earnRecordModel.exchangeConfirm( + binding.edGold.text.toString().toLong(), + binding.edDiamond.text.toString().toLong(), + 1 + ) + } else if (isGold) { + earnRecordModel.exchangeConfirm( + binding.edGold.text.toString().toLong(), + binding.edDiamond.text.toString().toLong(), + 3 + ) + } + } + } + } } diff --git a/app/src/main/java/com/yizhuan/erban/earn/activity/EarnRecordActivity.kt b/app/src/main/java/com/yizhuan/erban/earn/activity/EarnRecordActivity.kt index 441f04491..4357e1b68 100644 --- a/app/src/main/java/com/yizhuan/erban/earn/activity/EarnRecordActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/earn/activity/EarnRecordActivity.kt @@ -58,6 +58,12 @@ class EarnRecordActivity : BaseViewBindingActivity(), } } + earnRecordModel.getConfigWithdrawLiveData.observe(this) { + it?.let { + EarnWithdrawActivity.start(this, it) + } + } + earnRecordModel.getEarnRecordInfo() } @@ -90,7 +96,7 @@ class EarnRecordActivity : BaseViewBindingActivity(), earnRecordModel.getGoldToDiamondInfo() } R.id.tvConvertWithdraw -> {//提现 - EarnWithdrawActivity.start(this) + earnRecordModel.getConfigWithdraw() } } } diff --git a/app/src/main/java/com/yizhuan/erban/earn/activity/EarnWithdrawActivity.kt b/app/src/main/java/com/yizhuan/erban/earn/activity/EarnWithdrawActivity.kt index 92229f913..bbb7d9874 100644 --- a/app/src/main/java/com/yizhuan/erban/earn/activity/EarnWithdrawActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/earn/activity/EarnWithdrawActivity.kt @@ -2,28 +2,139 @@ package com.yizhuan.erban.earn.activity import android.content.Context import android.content.Intent +import android.text.Editable +import android.text.TextWatcher +import android.view.View +import androidx.activity.viewModels +import com.jungly.gridpasswordview.GridPasswordView import com.netease.nim.uikit.StatusBarUtil import com.yizhuan.erban.R import com.yizhuan.erban.base.BaseViewBindingActivity import com.yizhuan.erban.databinding.ActivityEarnWithdrawBinding +import com.yizhuan.erban.earn.EarnRecordViewModel +import com.yizhuan.erban.pay.password.GiveGoldPassWordFragment +import com.yizhuan.erban.ui.setting.ModifyPwdActivity +import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog +import com.yizhuan.erban.ui.widget.password.PassWordFragment +import com.yizhuan.xchat_android_core.earn.bean.ConfigWithdrawInfo +import com.yizhuan.xchat_android_core.pay.PayModel +import com.yizhuan.xchat_android_core.user.UserModel +import com.yizhuan.xchat_android_library.utils.ResUtil +import kotlinx.android.synthetic.main.activity_give_gold_to_user.* /** * author: wushaocheng * time: 2022/11/18 * desc: 提现 */ -class EarnWithdrawActivity : BaseViewBindingActivity() { +class EarnWithdrawActivity : BaseViewBindingActivity(), + GridPasswordView.OnPasswordChangedListener { + + private val earnRecordModel: EarnRecordViewModel by viewModels() + + private var passWordFragment: GiveGoldPassWordFragment? = null companion object { + + const val BEAN = "bean" + @JvmStatic - fun start(context: Context) { + fun start(context: Context, configWithdrawInfo: ConfigWithdrawInfo) { val starter = Intent(context, EarnWithdrawActivity::class.java) + starter.putExtra(BEAN, configWithdrawInfo) context.startActivity(starter) } } override fun init() { initTitleBar(getString(R.string.withdraw)) + val bean = intent.getSerializableExtra(BEAN) as? ConfigWithdrawInfo + bean?.let { + binding.tvMyGold.text = getString(R.string.my_gold, it.golds.toString()) + binding.edGold.hint = it.minGolds.toString() + binding.tvWithdrawNum.text = + getString(R.string.number_of_withdrawals_in_remaining_weeks, it.remainTimes) + if (it.account.uid != 0L) { + binding.groupBind.visibility = View.VISIBLE + binding.tvNoWithdraw.visibility = View.GONE + binding.tvSwift.text = getString(R.string.swift_code, it.account.swift) + binding.tvBankName.text = getString(R.string.bank_name, it.account.bankName) + } else { + binding.groupBind.visibility = View.GONE + binding.tvNoWithdraw.visibility = View.VISIBLE + } + + binding.edGold.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + + } + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + + } + + override fun afterTextChanged(p0: Editable?) { + binding.tvWithdraw.isEnabled = + it.account.uid != 0L && p0.toString().isNotEmpty() && it.remainTimes > 0 + } + + }) + + earnRecordModel.loadingLiveData.observe(this) { loading -> + if (loading) dialogManager.showProgressDialog(this) + else dialogManager.dismissDialog() + } + + earnRecordModel.exchangeLiveData.observe(this) { exchange -> + exchange?.let { + passWordFragment?.dismissAllowingStateLoss() + toast(getString(R.string.withdraw_success)) + finish() + } ?: run { + passWordFragment?.dismissAllowingStateLoss() + } + } + + binding.tvWithdraw.setOnClickListener { view -> + UserModel.get().cacheLoginUserInfo?.let { userInfo -> + if (!userInfo.isBindPaymentPwd) { + val tipDialog = CommonTipDialog(this@EarnWithdrawActivity) + tipDialog.setTipMsg(ResUtil.getString(R.string.setting_pay_pwd_first)) + tipDialog.setOkText(getString(R.string.to_setting)) + tipDialog.setOnActionListener( + object : CommonTipDialog.OnActionListener { + override fun onOk() { + ModifyPwdActivity.start( + this@EarnWithdrawActivity, + ModifyPwdActivity.PAY_PWD + ) + } + } + ) + tipDialog.show() + } else if (binding.edGold.text.toString().toLong() < it.minGolds) { + toast("至少需要兌換${it.minGolds}金幣") + } else if (binding.edGold.text.toString().toLong() > it.maxGolds) { + toast("提現不能超過${it.maxGolds}金幣") + } else { + GiveGoldPassWordFragment.newInstance( + supportFragmentManager, + "1000", + "哈哈", + "" + ) + .apply { + passWordFragment = this + setListener(this@EarnWithdrawActivity) + } + } + } ?: run { + toast(ResUtil.getString(R.string.ui_setting_settingactivity_06)) + return@setOnClickListener + } + } + + } } override fun needSteepStateBar() = true @@ -34,5 +145,16 @@ class EarnWithdrawActivity : BaseViewBindingActivity \ No newline at end of file diff --git a/app/src/main/res/layout/activity_earn_record.xml b/app/src/main/res/layout/activity_earn_record.xml index 07ec5b062..7b2b83e9d 100644 --- a/app/src/main/res/layout/activity_earn_record.xml +++ b/app/src/main/res/layout/activity_earn_record.xml @@ -159,6 +159,7 @@ android:layout_marginTop="18dp" android:layout_marginEnd="@dimen/dp_20" android:layout_marginBottom="@dimen/dp_18" + android:visibility="gone" android:gravity="center" android:text="@string/withdraw" android:textColor="@color/color_582815" diff --git a/app/src/main/res/layout/activity_earn_withdraw.xml b/app/src/main/res/layout/activity_earn_withdraw.xml index aec7e3bbf..6bbec4c53 100644 --- a/app/src/main/res/layout/activity_earn_withdraw.xml +++ b/app/src/main/res/layout/activity_earn_withdraw.xml @@ -26,6 +26,7 @@ app:layout_constraintTop_toBottomOf="@+id/title_bar"> + + + + + + + android:layout_marginEnd="@dimen/dp_14" + android:drawablePadding="@dimen/dp_2" + android:text="@string/ui_withdraw_withdrawactivity_09" + android:textColor="@color/color_6D6B89" + android:textSize="@dimen/sp_13" + app:drawableEndCompat="@drawable/ic_withdraw_record_arrow" + app:layout_constraintBottom_toBottomOf="@+id/tvMyGold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@+id/tvMyGold" /> + app:layout_constraintTop_toBottomOf="@+id/csMyGold" /> + android:orientation="horizontal"> 剩餘周提現次數:%d次 立即提現 選擇游戲 + 兑换成功 + swift code/BIC:%s + bank name:%s + 提現成功 \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/ConfigWithdrawInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/ConfigWithdrawInfo.kt new file mode 100644 index 000000000..8c3f76e78 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/ConfigWithdrawInfo.kt @@ -0,0 +1,13 @@ +package com.yizhuan.xchat_android_core.earn.bean + +import java.io.Serializable + +data class ConfigWithdrawInfo( + val account: WithdrawAccount, + val golds: Double,//钱包当前金币数 + val remainTimes: Int,//周剩余次数 + val fee: Double,//手续费 + val minGolds: Long, + val maxGolds: Long, + val hasPayPwd: Boolean +) : Serializable \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/GoldToDiamondInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/GoldToDiamondInfo.kt index 77c93f97b..593b75e29 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/GoldToDiamondInfo.kt +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/GoldToDiamondInfo.kt @@ -7,5 +7,7 @@ data class GoldToDiamondInfo( val golds: Double, val rate: Double, val maxDiamonds: Long, - val minDiamonds: Long + val minDiamonds: Long, + val maxGolds: Long, + val minGolds: Long, ) : Serializable \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/WithdrawAccount.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/WithdrawAccount.kt new file mode 100644 index 000000000..ad7360762 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/bean/WithdrawAccount.kt @@ -0,0 +1,15 @@ +package com.yizhuan.xchat_android_core.earn.bean + +import java.io.Serializable + +data class WithdrawAccount( + val uid: Long, + val swift: String, + val bankName: String, + val accountNumber: String, + val accountName: String, + val address: String, + val city: String, + val province: String, + val postCode: String +) : Serializable \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/model/EarnModel.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/model/EarnModel.kt index d5f3e3e65..604b33475 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/model/EarnModel.kt +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/earn/model/EarnModel.kt @@ -2,12 +2,15 @@ package com.yizhuan.xchat_android_core.earn.model import com.yizhuan.xchat_android_core.base.BaseModel import com.yizhuan.xchat_android_core.bean.response.ServiceResult +import com.yizhuan.xchat_android_core.earn.bean.ConfigWithdrawInfo import com.yizhuan.xchat_android_core.earn.bean.EarnRecordInfo import com.yizhuan.xchat_android_core.earn.bean.GoldToDiamondInfo import com.yizhuan.xchat_android_core.home.bean.* import com.yizhuan.xchat_android_core.utils.net.launchRequest import com.yizhuan.xchat_android_library.net.rxnet.RxNet import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query object EarnModel : BaseModel() { @@ -23,6 +26,25 @@ object EarnModel : BaseModel() { api.getGoldToDiamondInfo() } + suspend fun exchangeConfirm( + goldNum: Long, + diamondNum: Long, + currency: Int + ): String? = + launchRequest { + api.exchangeConfirm(goldNum, diamondNum, currency) + } + + suspend fun getConfigWithdrawInfo(): ConfigWithdrawInfo? = + launchRequest { + api.getConfigWithdrawInfo() + } + + suspend fun exchange(goldNum: Long, payPwd: String): String? = + launchRequest { + api.exchange(goldNum, payPwd) + } + private interface Api { /** @@ -37,6 +59,31 @@ object EarnModel : BaseModel() { @GET("/goldExchangeDiamond/getConfig") suspend fun getGoldToDiamondInfo(): ServiceResult + /** + * @return + */ + @POST("/goldExchangeDiamond/exchange") + suspend fun exchangeConfirm( + @Query("goldNum") goldNum: Long, + @Query("diamondNum") diamondNum: Long, + @Query("currency") currency: Int + ): ServiceResult + + /** + * @return + */ + @GET("/withdraw/getConfig") + suspend fun getConfigWithdrawInfo(): ServiceResult + + /** + * @return + */ + @POST("/withdraw/exchange") + suspend fun exchange( + @Query("goldNum") goldNum: Long, + @Query("payPwd") payPwd: String + ): ServiceResult + } } \ No newline at end of file diff --git a/library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/DoubleUtils.java b/library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/DoubleUtils.java new file mode 100644 index 000000000..399ea8c0f --- /dev/null +++ b/library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/DoubleUtils.java @@ -0,0 +1,99 @@ +package com.yizhuan.xchat_android_library.common.util; + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +/** + * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。 + */ +public class DoubleUtils{ + private static final int DEF_DIV_SCALE = 2; + + /** + * @Description 两个Double数相加 + * + * @param d1 + * @param d2 + * @return Double + */ + public static Double add(Double d1,Double d2){ + BigDecimal b1 = new BigDecimal(d1.toString()); + BigDecimal b2 = new BigDecimal(d2.toString()); + return b1.add(b2).doubleValue(); + } + + /** + * @Description 两个Double数相减 + * + * @param d1 + * @param d2 + * @return Double + */ + public static Double sub(Double d1,Double d2){ + BigDecimal b1 = new BigDecimal(d1.toString()); + BigDecimal b2 = new BigDecimal(d2.toString()); + return b1.subtract(b2).doubleValue(); + } + + /** + * @Description 两个Double数相乘 + * + * @param d1 + * @param d2 + * @return Double + */ + public static Double mul(Double d1,Double d2){ + BigDecimal b1 = new BigDecimal(d1.toString()); + BigDecimal b2 = new BigDecimal(d2.toString()); + return b1.multiply(b2).doubleValue(); + } + + /** + * @Description 两个Double数相除 + * + * @param d1 + * @param d2 + * @return Double + */ + public static Double div(Double d1,Double d2){ + BigDecimal b1 = new BigDecimal(d1.toString()); + BigDecimal b2 = new BigDecimal(d2.toString()); + return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * @Description 两个Double数相除,并保留scale位小数 + * + * @param d1 + * @param d2 + * @param scale + * @return Double + */ + public static Double div(Double d1,Double d2,int scale){ + if(scale<0){ + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(d1.toString()); + BigDecimal b2 = new BigDecimal(d2.toString()); + return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * @Description String类型小数与Double类型的转换 + */ + public static void StrToDouble(){ + String str="1234.5678"; + double num; + DecimalFormat myformat = new DecimalFormat("#0.00"); + num = Double.parseDouble(str);//直接转换为double类型 + num = Double.parseDouble(myformat.format(num));//保留2为小数 + System.out.println(num); + } + + public static String convertDoubleToString(double number) { + DecimalFormat df = new DecimalFormat("######0"); + return df.format(number); + } + +}