cloudroam
2025-04-16 66a4a5c3aa78869a3c51e79f2a6a610c99016c24
app/src/main/java/com/example/firstapp/activity/VipActivity.kt
@@ -1,6 +1,7 @@
package com.example.firstapp.activity
import android.app.AlertDialog
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.util.TypedValue
@@ -10,7 +11,6 @@
import android.widget.Button
import android.widget.CheckBox
import android.widget.CompoundButton
import android.widget.EditText
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
@@ -19,22 +19,29 @@
import androidx.cardview.widget.CardView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.navigation.ui.AppBarConfiguration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.firstapp.R
import com.example.firstapp.adapter.CardAdapter
import com.example.firstapp.database.request.ProductOrdersRequest
import com.example.firstapp.database.response.UserInfo
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.databinding.ActivityVipBinding
import com.example.firstapp.model.CardData
import com.example.firstapp.model.MemberBenefitItem
import com.example.firstapp.pay.PayAbility
import com.example.firstapp.ui.vip.MemberInfoCardFragment
import com.example.firstapp.utils.Log
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.example.firstapp.utils.PreferencesManager
import com.google.gson.Gson
import kotlinx.coroutines.launch
import java.math.BigDecimal
class VipActivity : AppCompatActivity() {
@@ -42,6 +49,16 @@
    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityVipBinding
    private var isPaymentSelected = false // 全局变量,默认未选中
    private var orderName = ""
    private var orderType=""
    private var currentPrice = BigDecimal.ZERO
    private var originalPrice = BigDecimal.ZERO
    private var paymentMethod = ""
    private var currentUserInfo: UserInfo? = null // 确保使用你的实际数据类
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
@@ -64,6 +81,9 @@
            finish()
        }
//        会员基本信息初始化
        loadUserInfo()
//        会员卡片初始化
        vipCardInit()
@@ -78,6 +98,10 @@
        // 勾选协议点击事件
        handlePrototalClick()
        // VIP会员服务协议
        handleVipProtocolClick()
    }
@@ -87,11 +111,11 @@
        // 监听 RadioButton 选中状态
        protocol.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
            isPaymentSelected = isChecked // 更新全局变量
            if(isChecked){
                protocol.background = ContextCompat.getDrawable(this, R.drawable.checkbox_round_selected)
            }else{
                protocol.background = ContextCompat.getDrawable(this, R.drawable.checkbox_round)
            }
//            if(isChecked){
//                protocol.background = ContextCompat.getDrawable(this, R.drawable.checkbox_round_selected)
//            }else{
//                protocol.background = ContextCompat.getDrawable(this, R.drawable.checkbox_round)
//            }
        })
    }
@@ -115,7 +139,19 @@
    private fun doAlipay(){
        lifecycleScope.launch {
            try {
                val response = RetrofitClient.apiService.getPayOrderInfo()
                var request = ProductOrdersRequest(
                    orderName=orderName,
                    orderType=orderType,
                    originalPrice=originalPrice,
                    currentPrice=currentPrice,
                    paymentMethod=""
                )
                Log.d("REQUEST", Gson().toJson(request))
                val response = RetrofitClient.apiService.getPayOrderInfo(request)
                Log.d("API_RESPONSE", response.toString())
                var orderInfo=response.data
                Log.d("AliPayHelper","获取订单信息时: ${response}")
                // 这里调用支付宝
@@ -125,6 +161,7 @@
//                                Snackbar.make(binding.root, "支付成功", Snackbar.LENGTH_LONG).show()
                            runOnUiThread {
                                Toast.makeText(this@VipActivity, "支付成功", Toast.LENGTH_LONG).show()
                                loadUserInfo()
                            }
                        }
                        else -> {
@@ -215,8 +252,9 @@
                        Toast.makeText(this@VipActivity, "请勾选协议", Toast.LENGTH_LONG).show()
                        return@launch // 直接 return,不往下执行
                    }
                    Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show()
                    return@launch
//                    Toast.makeText(this@VipActivity, "功能暂未开放", Toast.LENGTH_LONG).show()
//                    return@launch
                    doWechatPay()
                } catch (e: Exception) {
@@ -229,6 +267,23 @@
    }
    private fun doWechatPay() {
        val map=HashMap<String,String>()
        map["appId"]="wxb4ba3c02aa476ea1"
        map["partnerid"]="1900006771"
        map["package"]="Sign=WXPay"
        map["noncestr"]="2ac6c60ebfe7e549fbbc922ac54269bb"
        map["timeStamp"]="1606317975"
        map["prepayid"]="wx25232614962974fb29d1227819cc3e000g"
        map["sign"]="wx25232614962974fb29d1227819cc3e000g"
        PayAbility.wxPay(this, map, Observer { success ->
            if (success == 0) {
                Toast.makeText(this@VipActivity, "支付失败", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(this@VipActivity, "支付成功", Toast.LENGTH_LONG).show()
            }
        })
    }
    private fun vipCardInit() {
        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
@@ -240,21 +295,69 @@
                "首月限时特惠",
                "连续包月",
                "首次开通",
                "9.9",
                BigDecimal("0.01"),
                "次月起12元/月",
                "自动续费可随时取消"
                "自动续费可随时取消",
            ),
            CardData.Yearly(
                "折合9元/月",
                "年卡",
                "108",
                "168"
                BigDecimal("0.01"),
                BigDecimal("168")
            ),
            CardData.SingleMonth(
                "1个月",
                "15"
                BigDecimal("0.01")
            )
        )
        // 这里获取列表的第一项作为初始化的值
        // 获取第一项作为初始化的值
        try {
            val curentPriceTmp = cardList.firstOrNull()
            // 确保 currentPrice 不为空并获取价格
            currentPrice = when (curentPriceTmp) {
                is CardData.ContinueMonthly -> curentPriceTmp.price
                is CardData.Yearly -> curentPriceTmp.price
                is CardData.SingleMonth -> curentPriceTmp.price
                else -> BigDecimal.ZERO // 兜底处理,避免 null 时报错
            }
            val title = when (curentPriceTmp) {
                is CardData.ContinueMonthly -> curentPriceTmp.title
                is CardData.Yearly -> curentPriceTmp.title
                is CardData.SingleMonth -> curentPriceTmp.title
                else -> ""
            }
            originalPrice =  when (curentPriceTmp) {
                is CardData.ContinueMonthly -> BigDecimal.ZERO
                is CardData.Yearly -> curentPriceTmp.originalPrice
                is CardData.SingleMonth -> BigDecimal.ZERO
                else -> BigDecimal.ZERO
            }
            // 初始化支付
            orderName = title
            orderType = title
            val alipayAmount:TextView = findViewById(R.id.alipay_amount);
            val wechatAmount:TextView = findViewById(R.id.wechat_amount);
            val protocolDescLayout:TextView = findViewById(R.id.protocol_desc_layout);
            alipayAmount.text=currentPrice.toString()
            wechatAmount.text=currentPrice.toString()
            protocolDescLayout.text="自动续费可随时取消,开通后每月按${currentPrice.toString()}元自动续费,可随时取消自动续费"
        }catch (e: Exception) {
            Toast.makeText(this@VipActivity, e.message, Toast.LENGTH_LONG).show()
            Log.d("AliPayHelper","支付失败: ${e.message}")
        }
        val adapter = CardAdapter(cardList) { cardViewList, cardData, cardView ->
            handleVipCardClick(cardViewList, cardData, cardView)
@@ -283,7 +386,16 @@
                layoutParams = ConstraintLayout.LayoutParams(
                    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt(),
                    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt()
                )
                ).apply {
                    // 设置 margin
                    setMargins(
                        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, resources.displayMetrics).toInt(), // left
                        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt(), // top
                        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, resources.displayMetrics).toInt(), // right
                        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt()  // bottom
                    )
                }
            }
            val textView = TextView(this).apply {
@@ -295,7 +407,8 @@
            val checkView = ImageView(this).apply {
                id = View.generateViewId()
                setImageResource(R.drawable.ic_check)
//                setImageResource(R.drawable.ic_check)
                setImageResource(R.mipmap.vip_right)
                layoutParams = ConstraintLayout.LayoutParams(
                    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt(),
                    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, resources.displayMetrics).toInt()
@@ -315,14 +428,14 @@
                ConstraintSet.TOP,
                previousViewId,
                if (index == 0) ConstraintSet.TOP else ConstraintSet.BOTTOM,
                16
                32
            )
            constraintSet.connect(
                iconView.id,
                ConstraintSet.START,
                ConstraintSet.PARENT_ID,
                ConstraintSet.START,
                16
                32
            )
            // Text 位置
@@ -332,7 +445,7 @@
                ConstraintSet.START,
                iconView.id,
                ConstraintSet.END,
                8
                32
            )
            // Check 位置
@@ -342,7 +455,7 @@
                ConstraintSet.END,
                ConstraintSet.PARENT_ID,
                ConstraintSet.END,
                16
                32
            )
            constraintSet.applyTo(container)
@@ -369,19 +482,81 @@
            is CardData.Yearly -> cardData.title
            is CardData.SingleMonth -> cardData.title
        }
        val price = when (cardData) {
        currentPrice = when (cardData) {
            is CardData.ContinueMonthly -> cardData.price
            is CardData.Yearly -> cardData.price
            is CardData.SingleMonth -> cardData.price
        }
        originalPrice =  when (cardData) {
            is CardData.ContinueMonthly -> BigDecimal.ZERO
            is CardData.Yearly -> cardData.originalPrice
            is CardData.SingleMonth -> BigDecimal.ZERO
        }
        val alipayAmount:TextView = findViewById(R.id.alipay_amount);
        val wechatAmount:TextView = findViewById(R.id.wechat_amount);
        alipayAmount.text=price
        wechatAmount.text=price
        alipayAmount.text=currentPrice.toString()
        wechatAmount.text=currentPrice.toString()
        // 处理点击事件,这里我们只是简单地展示一个 Toast
        Toast.makeText(this, "点击了: ${title}", Toast.LENGTH_SHORT).show()
//        Toast.makeText(this, "点击了: ${title}", Toast.LENGTH_SHORT).show()
        // 只有连续包月才展示
        val xieyiLayout:LinearLayout = findViewById(R.id.xieyi_layout);
        if (title == "连续包月") {
            xieyiLayout.visibility = View.VISIBLE
        }else{
            xieyiLayout.visibility = View.GONE
        }
        orderName = title
        orderType=title
    }
    private fun loadUserInfo() {
        // 获取Fragment实例
        val memberInfoCardFragment = supportFragmentManager.findFragmentById(R.id.memberInfoCardFragment) as MemberInfoCardFragment?
        lifecycleScope.launch {
            try {
                // 从本地获取保存的手机号
                val savedPhone = PreferencesManager.getPhone()
                if (savedPhone.isNullOrEmpty()) {
                    Toast.makeText(this@VipActivity, "用户未登录", Toast.LENGTH_SHORT).show()
                    return@launch
                }
                val response = RetrofitClient.apiService.getUserInfo(savedPhone)
                if (response.code == "0" && response.data != null) {
                    // 保存用户信息
                    currentUserInfo = response.data
                    val userInfo = response.data
                    // 调用ViewModel的刷新方法
                    memberInfoCardFragment?.viewModel?.updateMemberStatus(userInfo)
                }
            } catch (e: Exception) {
                e.printStackTrace()
                Toast.makeText(this@VipActivity, "获取用户信息失败", Toast.LENGTH_SHORT).show()
            }
        }
    }
    // VIP会员服务协议
    private fun handleVipProtocolClick(){
        binding.protocolVip.setOnClickListener{
            startContentActivity("VIP会员服务协议", "VIP会员服务协议")
        }
    }
    private fun startContentActivity(type: String, title: String) {
        val intent = Intent(this, ContentDetailActivity::class.java).apply {
            putExtra(ContentDetailActivity.ID, type)
            putExtra(ContentDetailActivity.EXTRA_TITLE, title)
        }
        startActivity(intent)
    }
}