Commit cd1a4149 authored by shiyl's avatar shiyl

修改网络请求工具类支持JSONObject参数,自定义本地json参数测试创建订单

parent e0e28792
......@@ -14,6 +14,10 @@ import com.yidian.bcommon.utils.NetWorkUtils
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import okhttp3.MediaType
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import timber.log.Timber
import java.lang.reflect.Type
......@@ -80,6 +84,32 @@ class HttpParamsUtils {
}
}
/**
* 获取业务参数(参数为JSONObject的情况)
* C端增加user_id
*/
fun getPrivateParamsMap(paramsJson: JSONObject, timeStamp: Long): RequestBody {
return if (RunConfig.IS_ENCRYPT) {
paramsJson.put("secret", getSignString(getRequestId(timeStamp), timeStamp))
paramsJson.put("ts", timeStamp.toString())
// C端身份请求加uid
BCommonManager.getUid()?.let { paramsJson.put("user_id", it) }
Timber.tag(BCommonManager.TAG_HTTP).d("request private params: $paramsJson")
val jsonObject = JSONObject()
jsonObject.put("tok", SecretUtil.rsaEncrypt(paramsJson.toString()))
//指定content type为json类型
val contentType: MediaType? = "application/json".toMediaTypeOrNull()
// JSONObject转为RequestBody
jsonObject.toString().toRequestBody(contentType)
} else {
// C端身份请求加uid
BCommonManager.getUid()?.let { paramsJson.put("user_id", it) }
Timber.tag(BCommonManager.TAG_HTTP).d("request private params: $paramsJson")
val contentType: MediaType? = "application/json".toMediaTypeOrNull()
paramsJson.toString().toRequestBody(contentType)
}
}
/**
* RSA解密Response
*/
......
package com.yidian.shenghuoquan.bmanagercenter.utils
package com.yidian.bcommon.utils
import android.content.Context
import android.content.res.AssetManager
......
......@@ -22,5 +22,9 @@ data class Goods(
@SerializedName("goods_sku_id")
val goodsSkuId: String? = null,
@SerializedName("goods_sku_num")
val goodsSkuNum: Int? = null
val goodsSkuNum: Int? = null,
@SerializedName("marketing_id")
val marketingId: Int? = null,// 活动id
@SerializedName("marketing_type")
val marketingType: Int? = null// 活动类型 类型:1分销 2团购 3秒杀,4 团餐
) : Parcelable
......@@ -30,7 +30,7 @@ class DemoTestActivity : BaseActivity<ActivityDemoTestBinding>() {
private fun initClick() {
val list = mutableListOf<Goods>()
list.add(Goods(goodsSkuId = "04qbwzoazPixJUhfOppD", goodsSkuNum = 1))
list.add(Goods(goodsSkuId = "04qbwzoazPixJUhfOppD", goodsSkuNum = 1, marketingId = 1, marketingType = 4))
val confirmOrderReqDto = ConfirmOrderRequest(businessFrom = 2, goodsList = list, marketingId = "79")
// 模拟h5进入确认订单的参数和逻辑
viewBind.btnOrderConfirm.clickAntiShake {
......
......@@ -11,7 +11,7 @@ import com.yidian.shenghuoquan.bmanagercenter.adapter.FirstCareerListAdapter
import com.yidian.shenghuoquan.bmanagercenter.adapter.SecondCareerListAdapter
import com.yidian.shenghuoquan.bmanagercenter.bean.CareerListBean
import com.yidian.shenghuoquan.bmanagercenter.databinding.ActivityChooseCareerBinding
import com.yidian.shenghuoquan.bmanagercenter.utils.JsonUtils
import com.yidian.bcommon.utils.JsonUtils
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageManager
......
{
"goods_list": [
{
"goods_sku_id": "04qbwzoazPixJUhfOppD",
"goods_sku_num": 1,
"marketing_id": 99,
"marketing_type": 4
}
],
"business_from": 2,
"marketing_id": 1
}
\ No newline at end of file
......@@ -33,13 +33,13 @@ data class SelectedCoupon(
*/
data class OrderGoods(
@SerializedName("goods_sku_id")
val goodsSkuId: String? = null,// 商品id
var goodsSkuId: String? = null,// 商品id
@SerializedName("goods_sku_num")
val goodsSkuNum: Int? = null,// 商品数量
var goodsSkuNum: Int? = null,// 商品数量
@SerializedName("marketing_id")
val marketingId: Int? = null,// 活动id
var marketingId: Int? = null,// 活动id
@SerializedName("marketing_type")
val marketingType: Int? = null// 活动类型 类型:1分销 2团购 3秒杀,4 团餐
var marketingType: Int? = null// 活动类型 类型:1分销 2团购 3秒杀,4 团餐
)
......
......@@ -4,6 +4,24 @@ import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize
/**
* 确认订单参数
*/
data class OrderConfirmReqDto(
@SerializedName("business_from")
val businessFrom: Int? = null,// 订单业务线--- 1 普通订单,2接龙订单
@SerializedName("marketing_id")
val marketingId: Int? = null,// 活动id
@SerializedName("goods_list")
val goodsList: List<OrderGoods>? = null,// 商品数组
// @SerializedName("user_id")
// val userId: Long? = null// 用户ID
)
/**
* 确认订单响应
*/
@Parcelize
data class OrderConfirmResDto(
@SerializedName("coupon_list")
......@@ -71,3 +89,4 @@ data class Shipping(
@SerializedName("address")
var address: String? = null,// 自提点地址
) : Parcelable
......@@ -2,6 +2,8 @@ package com.yidian.shenghuoquan.border.http
import com.yidian.bcommon.http.HttpResult
import io.reactivex.rxjava3.core.Observable
import okhttp3.RequestBody
import org.json.JSONObject
import retrofit2.http.*
/**
......@@ -47,7 +49,7 @@ interface OrderApiService {
@Headers("Content-Type: application/json")
fun requestOrderConfirm(
@QueryMap commonParams: Map<String, String>,
@Body requestParams: Map<String, String?>
@Body body: RequestBody
): Observable<HttpResult<Any?>>
/**
......@@ -57,7 +59,7 @@ interface OrderApiService {
@Headers("Content-Type: application/json")
fun requestCreateOrder(
@QueryMap commonParams: Map<String, String>,
@Body requestParams: Map<String, String?>
@Body body: RequestBody
): Observable<HttpResult<Any?>>
/**
......
......@@ -9,6 +9,7 @@ import com.yidian.shenghuoquan.border.dto.*
import com.yidian.shenghuoquan.border.http.callback.IApplyRefundCallback
import com.yidian.shenghuoquan.border.http.callback.IGetOrderDetailCallback
import com.yidian.shenghuoquan.border.http.callback.IGetPickupPointListCallback
import org.json.JSONObject
/**
* author: yinjiacheng
......@@ -62,7 +63,7 @@ object OrderRemoteDataSource {
/**
* 获取确认订单
*/
fun requestOrderConfirm(requestParams: HashMap<String, String?>, callback: ((OrderConfirmResDto?) -> Unit)? = null) {
fun requestOrderConfirm(requestParams: JSONObject, callback: ((OrderConfirmResDto?) -> Unit)? = null) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(requestParams, timeStamp)
......@@ -83,7 +84,7 @@ object OrderRemoteDataSource {
/**
* 创建订单
*/
fun requestCreateOrder(requestParams: HashMap<String, String?>, callback: ((CreateOrderResDto?) -> Unit)? = null) {
fun requestCreateOrder(requestParams: JSONObject, callback: ((CreateOrderResDto?) -> Unit)? = null) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(requestParams, timeStamp)
......
......@@ -6,18 +6,20 @@ import com.yidian.bcommon.constant.IntentConstants
import com.yidian.bcommon.constant.XEventConfig
import com.yidian.bcommon.constant.XRouterPathConstants
import com.yidian.bcommon.mvvm.BaseMvvmActivity
import com.yidian.bcommon.utils.JsonUtils
import com.yidian.shenghuoquan.border.R
import com.yidian.shenghuoquan.border.adapter.OrderConfirmCommodityListAdapter
import com.yidian.shenghuoquan.border.databinding.BorderActivityConfirmOrderBinding
import com.yidian.shenghuoquan.border.dto.PickupPoint
import com.yidian.shenghuoquan.border.dto.Shipping
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageManager
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.json.JSONObject
import timber.log.Timber
/**
* 确认订单
*/
......@@ -43,14 +45,34 @@ class ConfirmOrderActivity : BaseMvvmActivity<BorderActivityConfirmOrderBinding,
}
private fun getIntentData(intent: Intent?) {
val paramsMap = intent?.getSerializableExtra(XRouterPathConstants.ParamsKey)
if (paramsMap != null) {
paramsMap as HashMap<String, String?>
marketingId = paramsMap["marketing_id"]
vm.requestConfirmOrderInfo(paramsMap)
val params = intent?.getSerializableExtra(XRouterPathConstants.ParamsKey)
if (params != null) {
// 注意接收h5传过来的JSONObject
params as HashMap<String, Any?>
// params["自定义一个共用的key"] as JSONObject
// TODO 修改为h5传递的参数
parsingParameters()
}
}
private fun parsingParameters() {
// 解析本地json数据
val jsonStr = JsonUtils.file2JsonStr(this, "order.json")
jsonStr?.let {
val jsonObject = JSONObject(it)
Timber.tag("确认订单").e("订单请求参数JSON:${jsonObject}")
marketingId = jsonObject.optInt("marketing_id").toString()
requestConfirmOrder(jsonObject)
}
}
/**
* 请求确认订单
*/
private fun requestConfirmOrder(jsonObject: JSONObject) {
vm.requestConfirmOrderInfo(jsonObject)
}
private fun subscribeUiEvent() {
vm.goodsSuccessEvent.observe(this, {
adapter.setList(it)
......@@ -67,10 +89,8 @@ class ConfirmOrderActivity : BaseMvvmActivity<BorderActivityConfirmOrderBinding,
val hashMap = HashMap<String, Any?>()
hashMap[IntentConstants.KEY_EXTRA_PICKUP_POINT_ID] = it
hashMap[IntentConstants.KEY_EXTRA_MARKETING_ID] = id
Timber.e("活动id: $id")
XPageManager.push(XRouterPathConstants.PICKUP_POINT_ACTIVITY, hashMap)
}
}
}
......@@ -90,8 +110,8 @@ class ConfirmOrderActivity : BaseMvvmActivity<BorderActivityConfirmOrderBinding,
}
XEventConfig.CONFIRM_ORDER_CHOOSE_COUPON_SUCCESS -> {
// 选择优惠券成功
val selectedCouponIndex = event.body as Int
vm.chooseVoucherSuccess(selectedCouponIndex)
val indexList = event.body as List<Int>
vm.chooseVoucherSuccess(indexList)
}
}
}
......
......@@ -3,23 +3,26 @@ package com.yidian.shenghuoquan.border.ui
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yidian.bcommon.mvvm.BaseViewModel
import com.yidian.bcommon.mvvm.ErrorInfo
import com.yidian.bcommon.utils.ToastUtils
import com.yidian.shenghuoquan.border.dto.CouponDto
import com.yidian.shenghuoquan.border.dto.GoodsDto
import com.yidian.shenghuoquan.border.dto.PickupPoint
import com.yidian.shenghuoquan.border.dto.Shipping
import com.yidian.shenghuoquan.border.dto.*
import com.yidian.shenghuoquan.border.http.OrderRemoteDataSource
import org.json.JSONArray
import org.json.JSONObject
class ConfirmOrderViewModel : BaseViewModel() {
private lateinit var currentParamsJson: JSONObject// 当前订单的请求参数
private var originalAmount: Double = 0.00// 原价总和
var couponAmount: Double = 0.00// 优惠券金额
var couponAmountValue = MutableLiveData(0.00)
var couponNameValue = MutableLiveData("红包/优惠券")
var selectedPickUpPoint = MutableLiveData<Shipping?>()// 自提点
var receivingName = MutableLiveData<String>()// 收货人姓名
var receivingPhone = MutableLiveData<String>()//收货人电话
var selectedCoupon = MutableLiveData<CouponDto?>()// 选中的优惠券
var selectedCouponList = MutableLiveData<MutableList<CouponDto>?>()// 选中的优惠券
var couponsAvailableList = MutableLiveData<List<CouponDto>?>()// 可用优惠券列表
var totalAmount = MutableLiveData(0.00)// 合计金额 = 原价 - 优惠
var remark = MutableLiveData<String>()
......@@ -45,11 +48,12 @@ class ConfirmOrderViewModel : BaseViewModel() {
/**
* 请求订单信息
*/
fun requestConfirmOrderInfo(paramsMap: HashMap<String, String?>) {
OrderRemoteDataSource.requestOrderConfirm(paramsMap) {
fun requestConfirmOrderInfo(paramsJson: JSONObject) {
OrderRemoteDataSource.requestOrderConfirm(paramsJson) {
if (it == null) {
return@requestOrderConfirm
}
currentParamsJson = paramsJson
selectedPickUpPoint.value = it.shipping
receivingName.value = it.shipping?.receiverName ?: ""
receivingPhone.value = it.shipping?.receiverMobile ?: ""
......@@ -77,7 +81,11 @@ class ConfirmOrderViewModel : BaseViewModel() {
* 计算商品合计 = 原价 - 优惠
*/
private fun calculateTotalAmount() {
totalAmount.value = originalAmount - couponAmount
var total = originalAmount - couponAmount
if (total < 0) {
total = 0.00
}
totalAmount.value = total
}
/**
......@@ -105,13 +113,27 @@ class ConfirmOrderViewModel : BaseViewModel() {
_chooseCouponEvent.value = couponsAvailableList.value
}
fun chooseVoucherSuccess(selectedIndex: Int) {
/**
* 选择的优惠券金额已支持多选,⚠️ :名称和UI暂不支持
*/
fun chooseVoucherSuccess(indexList: List<Int>) {
// 获取选中的优惠券
val coupon = couponsAvailableList.value?.get(selectedIndex)
val list = mutableListOf<CouponDto>()
indexList.forEach {
val coupon = couponsAvailableList.value?.get(it)
//将该优惠券更新为选中状态
coupon?.selected = true
selectedCoupon.value = coupon
couponAmount = coupon?.amount?.toDouble() ?: 0.00
coupon?.let { couponDto ->
// 累加优惠券金额
couponAmount += couponDto.amount?.toDouble() ?: 0.00
couponDto.selected = true
list.add(couponDto)
}
}
selectedCouponList.value = list
// 更新优惠券总金额
couponAmountValue.value = couponAmount
// 更新选择优惠券名称
couponNameValue.value = couponsAvailableList.value?.get(0)?.name
// 重新计算相关金额
calculateTotalAmount()
}
......@@ -120,12 +142,30 @@ class ConfirmOrderViewModel : BaseViewModel() {
* 创建订单
*/
fun createOrder() {
val paramsMap = HashMap<String, String?>()
paramsMap["business_from"] = "2"
paramsMap["user_id"] = "510235230818"
// todo 添加其他参数
OrderRemoteDataSource.requestCreateOrder(paramsMap) {
if (selectedPickUpPoint.value?.takePlaceId == null) {
postErrorEvent(ErrorInfo(message = "请选择自提点"))
return
}
if (receivingName.value.isNullOrBlank()) {
postErrorEvent(ErrorInfo(message = "请输入收货姓名"))
return
}
if (receivingPhone.value.isNullOrBlank()) {
postErrorEvent(ErrorInfo(message = "请输入手机号码"))
return
}
if (receivingPhone.value?.length != 11) {
postErrorEvent(ErrorInfo(message = "请输入11位手机号码"))
return
}
if (!selectedCouponList.value.isNullOrEmpty()) {// 添加上选中的优惠券
currentParamsJson.put("coupon_list", JSONArray(selectedCouponList.value))
}
currentParamsJson.put("take_place_id", selectedPickUpPoint.value?.takePlaceId)
currentParamsJson.put("receiver_name", receivingName.value)
currentParamsJson.put("receiver_mobile", receivingPhone.value)
currentParamsJson.put("comment", remark.value)
OrderRemoteDataSource.requestCreateOrder(currentParamsJson) {
ToastUtils.showShort("创建订单成功${it?.orderId}")
}
}
......
......@@ -193,6 +193,7 @@
android:background="@null"
android:hint="请输入收货人电话号码"
android:inputType="phone"
android:maxLength="11"
android:singleLine="true"
android:text="@={vm.receivingPhone}"
android:textColor="@color/color_333333"
......@@ -254,7 +255,7 @@
android:drawableStart="@drawable/icon_red_envelope"
android:drawablePadding="@dimen/dp5"
android:singleLine="true"
android:text="@{vm.selectedCoupon.name ?? @string/red_packet_or_coupon}"
android:text="@{vm.couponNameValue ?? @string/red_packet_or_coupon}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
......@@ -275,7 +276,7 @@
android:text="@{vm.couponsAvailableList.size() + @string/coupons_available_num}"
android:textColor="@color/white"
android:textSize="11sp"
app:isShow="@{vm.selectedCoupon.amount == null}"
app:isShow="@{vm.selectedCouponList.size() == 0}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_coupons_next_arrow"
app:layout_constraintHorizontal_bias="1"
......@@ -291,10 +292,10 @@
android:paddingTop="@dimen/dp2"
android:paddingEnd="@dimen/dp5"
android:paddingBottom="@dimen/dp2"
android:text="@{vm.selectedCoupon.amount}"
android:text="@{vm.couponAmountValue.toString()}"
android:textColor="@color/color_FD7823"
android:textSize="11sp"
app:isShow="@{vm.selectedCoupon.amount != null}"
app:isShow="@{vm.selectedCouponList.size() > 0}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_coupons_next_arrow"
app:layout_constraintHorizontal_bias="1"
......
......@@ -66,6 +66,9 @@ object BaseInitConfig {
}, 20//webview缓存池数量,默认不缓存
)
/**
* 接收h5调用服务传递的数据
*/
XBridManager.registerServiceInvoker(object : OnServiceInvoke {
override fun onCall(
identifier: String, // the identifier assigned when webview created
......@@ -94,8 +97,12 @@ object BaseInitConfig {
}
})
/**
* 接收h5调用XPage传递的数据
*/
XBridManager.registerXPageInvoker(object : OnXPageInvoke {
override fun onCall(identifier: String, xWebView: XWebView, request: XPageRequest) {
// 将传递的参数整合到新建的map中,如果下游页面需要的参数是JSONObject需要将JSONObject作为map的value传递
val params = mutableMapOf<String, Any>()
(request.params as JSONObject).let { reParams ->
reParams.keys().forEach {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment