1:完成家族中续签请求接口和弹框展示的文案

This commit is contained in:
2025-11-28 16:53:27 +08:00
parent 995d7c1e90
commit 2b750c5f06
7 changed files with 172 additions and 28 deletions

View File

@@ -40,7 +40,7 @@ class MyFamilyBean {
var mic_cycle: String = "" //麦圈
var nobility_image: String = "" //贵族
var nickname_color: String = "" //贵族颜色
var free_renewal: String = "" //免费续签次数
var free_renewal: Int = 0 //免费续签次数
var today_earnings: String = "" //今日收礼收益
var yesterday_earnings: String = "" //昨日收礼收益
var is_online: Int = 0 //是否在线 1在线 0离线

View File

@@ -9,6 +9,7 @@ import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.text.SpannableString;
import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
@@ -26,6 +27,7 @@ public class ConfirmDialog extends Dialog {
private String title;
private String message;
private SpannableString spannableMessage;
private String positiveButtonText;
private String negativeButtonText;
private View.OnClickListener positiveButtonClickListener;
@@ -50,6 +52,23 @@ public class ConfirmDialog extends Dialog {
this.isCountdownEnabled = isCountdownEnabled;
this.countdownSeconds = countdownSeconds;
}
// 新增构造函数支持SpannableString
public ConfirmDialog(Context context, String title, SpannableString spannableMessage,
String positiveButtonText, String negativeButtonText,
View.OnClickListener positiveButtonClickListener,
View.OnClickListener negativeButtonClickListener,
boolean isCountdownEnabled, int countdownSeconds) {
super(context);
this.title = title;
this.spannableMessage = spannableMessage;
this.positiveButtonText = positiveButtonText;
this.negativeButtonText = negativeButtonText;
this.positiveButtonClickListener = positiveButtonClickListener;
this.negativeButtonClickListener = negativeButtonClickListener;
this.isCountdownEnabled = isCountdownEnabled;
this.countdownSeconds = countdownSeconds;
}
private void init() {
Window window = getWindow();
@@ -76,7 +95,12 @@ public class ConfirmDialog extends Dialog {
// 设置文本
tvTitle.setText(title);
tvMessage.setText(message);
// 根据是否有spannableMessage来设置不同的文本
if (spannableMessage != null) {
tvMessage.setText(spannableMessage);
} else {
tvMessage.setText(message);
}
btnPositive.setText(positiveButtonText);
btnNegative.setText(negativeButtonText);

View File

@@ -884,4 +884,12 @@ public interface ApiServer {
@GET(Constants.GET_SKILL_LIST)
Call<BaseModel<List<String>>> skillList();
@FormUrlEncoded
@POST(Constants.POST_FREE_RE_SIGN)
Call<BaseModel<String>> freeReSign(@Field("user_id") String user_id);
@FormUrlEncoded
@POST(Constants.POST_RE_SIGN)
Call<BaseModel<String>> reSign(@Field("user_id") String user_id);
}

View File

@@ -4738,5 +4738,35 @@ public class RetrofitClient {
});
}
public void freeReSign(int type, String userId,BaseObserver<String> observer) {
if (type==1) {
sApiServer.freeReSign(userId).enqueue(new Callback<BaseModel<String>>() {
@Override
public void onResponse(Call<BaseModel<String>> call, Response<BaseModel<String>> response) {
onNextRetu(response, observer);
}
@Override
public void onFailure(Call<BaseModel<String>> call, Throwable t) {
LogUtils.e("freeReSign", t.fillInStackTrace());
}
});
}else {
sApiServer.reSign(userId).enqueue(new Callback<BaseModel<String>>() {
@Override
public void onResponse(Call<BaseModel<String>> call, Response<BaseModel<String>> response) {
onNextRetu(response, observer);
}
@Override
public void onFailure(Call<BaseModel<String>> call, Throwable t) {
LogUtils.e("reSign", t.fillInStackTrace());
}
});
}
}
}

View File

@@ -431,6 +431,8 @@ public class Constants {
public static final String POST_FRIEND_LIST_MORE = "/api/User/get_friend_list_more";//挚友列表查看更多
public static final String POST_SEND_LOG = "api/Report/android_log_report";//上传log信息
public static final String GET_SKILL_LIST = "/api/Sign/skill_list";//才艺列表
public static final String POST_FREE_RE_SIGN = "/api/Sign/free_re_sign";//免费续约
public static final String POST_RE_SIGN = "/api/Sign/re_sign";//续签(花金币)

View File

@@ -54,6 +54,10 @@ class UserFamilyActivity : BaseMvpActivity<UserFamilyPresenter, ActivityUserFami
MvpPre?.myFamily(type)
}
fun upData(){
MvpPre?.myFamily(type)
}
override fun getLayoutId(): Int {
return R.layout.activity_user_family

View File

@@ -2,6 +2,9 @@ package com.xscm.modulemain.activity.user.fragment
import android.content.Intent
import android.graphics.Color
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.View
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.ToastUtils
@@ -9,15 +12,20 @@ import com.tencent.imsdk.v2.V2TIMConversation
import com.tencent.qcloud.tuicore.TUIConstants
import com.tencent.qcloud.tuikit.tuichat.classicui.page.TUIGroupChatActivity
import com.xscm.modulemain.R
import com.xscm.modulemain.activity.room.activity.RoomActivity
import com.xscm.modulemain.activity.user.activity.HeartCpActivity
import com.xscm.modulemain.activity.user.activity.TotalRevenueActivity
import com.xscm.modulemain.activity.user.activity.UserFamilyActivity
import com.xscm.modulemain.activity.user.activity.UserHomepageActivity
import com.xscm.modulemain.adapter.MyFamilyAdapter
import com.xscm.modulemain.databinding.FragmentMyFamilyBinding
import com.xscm.moduleutil.base.BaseFragment
import com.xscm.moduleutil.bean.MyFamilyBean
import com.xscm.moduleutil.dialog.ConfirmDialog
import com.xscm.moduleutil.http.BaseObserver
import com.xscm.moduleutil.http.RetrofitClient
import com.xscm.moduleutil.widget.CommonEmptyView
import io.reactivex.disposables.Disposable
/**
* @Author qx
@@ -29,7 +37,7 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
private var dataList = mutableListOf<MyFamilyBean.GroupMembersListsBean>()
private var adapter: MyFamilyAdapter? = null
private var userId: Int = 0
private var myFamilyBean : MyFamilyBean= MyFamilyBean()
private var myFamilyBean: MyFamilyBean = MyFamilyBean()
override fun onDestroyView() {
@@ -42,8 +50,8 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
override fun initView() {
mBinding.tvZsyNum2.setOnClickListener {
val intent= Intent(activity, TotalRevenueActivity::class.java)
intent.putExtra("userId",userId)
val intent = Intent(activity, TotalRevenueActivity::class.java)
intent.putExtra("userId", userId)
startActivity(intent)
}
@@ -54,7 +62,7 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
intent.putExtra(TUIConstants.TUIChat.CHAT_NAME, myFamilyBean.name)
intent.putExtra(TUIConstants.TUIChat.CHAT_TYPE, V2TIMConversation.V2TIM_GROUP)
startActivity(intent)
}else{
} else {
ToastUtils.showLong("家族群至少需要签约一位徒弟")
}
}
@@ -64,12 +72,10 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
intent.putExtra("userId", myFamilyBean.user_id.toString())
startActivity(intent)
}
}
override fun getLayoutId(): Int {
return R.layout.fragment_my_family
return R.layout.fragment_my_family
}
companion object {
@@ -88,40 +94,50 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
private fun queren1(
type: Int,
content: String?,
content: SpannableString?,
userId: String,
) {
// 创建并显示确认对话框
ConfirmDialog(
val dialog = ConfirmDialog(
ActivityUtils.getTopActivity(),
"续约提示",
content,
if (type == 1) "确认免费续约" else "确认续约",
"取消",
View.OnClickListener { v: View? ->
if (type == 1) {
{ v: View? ->
RetrofitClient.getInstance()
.freeReSign(type, userId, object : BaseObserver<String>() {
override fun onSubscribe(d: Disposable) {
}
} else {
val userids = userId.toInt()
val intent = Intent(ActivityUtils.getTopActivity(), HeartCpActivity::class.java)
intent.putExtra("userId", userids)
startActivity(intent)
}
override fun onNext(t: String) {
(ActivityUtils.getTopActivity() as? UserFamilyActivity)?.let { userFamilyActivity ->
userFamilyActivity.upData()
}
}
});
},
View.OnClickListener { v: View? -> }, false, 0
).show()
{ v: View? -> }, false, 0
)
dialog.show()
}
fun myFamily1(data: MyFamilyBean) {
fun myFamily1(data: MyFamilyBean) {
myFamilyBean= data
myFamilyBean = data
userId = data.user_id
dataList.clear()
dataList.addAll(data.group_members_lists)
mBinding.headView.setData(data.group_owner_info?.avatar,data.group_owner_info?.dress,data.group_owner_info?.nobility_image)
mBinding.headView.setData(
data.group_owner_info?.avatar,
data.group_owner_info?.dress,
data.group_owner_info?.nobility_image
)
mBinding.tvUserName.text = data.group_owner_info?.nickname
if (data.group_owner_info?.nickname_color?.isNotEmpty() == true){
if (data.group_owner_info?.nickname_color?.isNotEmpty() == true) {
mBinding.tvUserName.startColor = Color.parseColor(data.group_owner_info?.nickname_color)
mBinding.tvUserName.shineColor = Color.parseColor(data.group_owner_info?.nickname_color)
mBinding.tvUserName.endColor = Color.parseColor(data.group_owner_info?.nickname_color)
@@ -133,7 +149,7 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
mBinding.tvZsyNum.text = data.group_earnings
mBinding.tvSignNum.setText("签约次数:${data.group_members_num}")
adapter = MyFamilyAdapter(activity!!,userId, R.layout.item_family_members, dataList)
adapter = MyFamilyAdapter(activity!!, userId, R.layout.item_family_members, dataList)
mBinding.recyclerView.adapter = adapter
val commonEmptyView = CommonEmptyView(activity!!)
commonEmptyView.setImg(R.mipmap.ic_empty)
@@ -143,8 +159,29 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
adapter?.setOnItemChildClickListener { adapter, view, position ->
if (view.id == R.id.tv_renew) {
val item = dataList[position]
queren1(1, "是否确认免费续约", item.user_id.toString())
}else if (view.id == R.id.iv_head) {
if (item.free_renewal > 0) {
queren1(
1,
onMessage(1, item.nickname, item.free_renewal, null, null, null),
item.user_id.toString()
)
} else {
queren1(
2,
onMessage(
2,
item.nickname,
item.free_renewal,
item.sign_user_ratio,
item.sign_times,
item.market_value.toInt()
),
item.user_id.toString()
)
}
} else if (view.id == R.id.iv_head) {
val item = dataList[position]
val intent = Intent(activity, UserHomepageActivity::class.java)
intent.putExtra("userId", item.user_id.toString())
@@ -152,4 +189,43 @@ class MyFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentMyFamilyBi
}
}
}
private fun onMessage(
type: Int,//类型 1免费续约 2续签 花金币
userName: String? = null, //当前徒弟的名称
remainingCount: Int? = 0, //当前免费续签次数
percentage: Int? = null, //身价的百分比,是按照这个进行扣款的
days: Int? = null,// 花钱后最总的时长
userValue: Int? = null //当前徒弟的身价
): SpannableString {
return when (type) {
1 -> SpannableString("尊敬的用户:\n 您的徒弟【${userName ?: "?"}】当前为首次签约的免费签约期。续约后师徒合约将延续7天您剩余的免费续约次数${remainingCount ?: "?"}")
2 -> {
// 计算预估金币数,向上取整
val actualUserValue = userValue ?: 1000 // 如果未提供用户身价默认使用1000
val percentageValue = percentage ?: 10
val estimatedCoins =
kotlin.math.ceil(actualUserValue * percentageValue / 100.0).toInt()
val mainText =
"尊敬的用户:\n 本次续约将预估支付${estimatedCoins}金币(【${userName ?: "?"}】身价的 ${percentageValue}% )作为续约费用,续约后,师徒合约将延长 ${days ?: 30}\n\n"
val noteText = "注:支付价格是预估价格,徒弟身价是实时变化,续约后无法取消"
val fullText = "$mainText$noteText"
val spannable = SpannableString(fullText)
// 设置注释部分为红色
val color = Color.RED
spannable.setSpan(
ForegroundColorSpan(color),
mainText.length,
fullText.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable
}
else -> SpannableString("")
}
}
}