Commit c6be79c1 authored by yinjiacheng's avatar yinjiacheng

add 订单详情页埋点

parent 7eb87917
......@@ -30,8 +30,6 @@ class XEventConfig {
const val SEARCH_PICKUP_POINT_CANCEL = "search_pickup_point_cancel"
// 开始搜索自提点
const val SEARCH_PICKUP_POINT_START = "search_pickup_point_start"
// 申请退款成功
const val APPLY_REFUND_SUCCESS = "apply_refund_success"
// C端登录成功
const val CLIENT_C_LOGIN_SUCCESS = "client_c_login_success"
}
......
......@@ -130,7 +130,9 @@ data class MergeOrderItem(
@SerializedName("goods_num")
val goodsNum: Int,
@SerializedName("price")
val price: Double
val price: Double,
@SerializedName("goods_sku_id")
val goodsSkuId: String,
)
data class OrderItem(
......
package com.yidian.shenghuoquan.buserorder.ui
import android.os.Bundle
import androidx.activity.viewModels
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.widget.CommonTopBarView
import com.yidian.shenghuoquan.buserorder.R
import com.yidian.shenghuoquan.buserorder.databinding.BorderActivityOrderDetailBinding
import com.yidian.shenghuoquan.buserorder.manager.OrderStatusManager
import com.yidian.shenghuoquan.buserorder.ui.widget.OrderCommodityInfoView
import com.yidian.shenghuoquan.buserorder.ui.widget.OrderPickupPointInfoView
import com.yidian.shenghuoquan.buserorder.viewmodel.OrderDetailViewModel
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageManager
import com.yidian.xpage.XPageViewProtocol
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* author: yinjiacheng
* date: 2021/8/21 09:29
* description: 订单详情页
*/
class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, OrderDetailViewModel>(), XPageViewProtocol {
class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, OrderDetailViewModel>(), XPageViewProtocol,
CommonTopBarView.OnCommonTopBarBackCallback, OrderPickupPointInfoView.OnOrderPickupPointInfoCallback,
OrderCommodityInfoView.OnOrderCommodityInfoCallback {
override val layoutId: Int = R.layout.border_activity_order_detail
override val vm: OrderDetailViewModel by viewModels()
......@@ -41,17 +41,8 @@ class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, O
return XRouterPathConstants.ORDER_DETAIL_ACTIVITY
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
XEventManager.register(this)
}
override fun onDestroy() {
super.onDestroy()
XEventManager.unRegister(this)
}
override fun initView() {
binding.bvTopBar.setOnCommonTopBarCallback(this, null)
initSmartRefresh()
vm.orderDetailData.observe(this, {
// 结束刷新
......@@ -61,9 +52,9 @@ class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, O
val status = OrderStatusManager.getOrderStatus(it.orderStatus)
// 更新UI
binding.svOrderStatus.setOrderStatus(status, it)
binding.pvPickupPointInfo.setPickupPoint(it.placeList)
binding.pvPickupPointInfo.setPickupPoint(it.placeList, this)
binding.ivConsigneeInfo.setConsigneeInfo(status, it.orderShippingInfo)
binding.ivCommodityInfo.setCommodityInfo(status, it)
binding.ivCommodityInfo.setCommodityInfo(status, it, this)
binding.ivOrderInfo.setOrderInfo(status, it)
})
binding.rlOrderDetail.autoRefresh()
......@@ -78,13 +69,25 @@ class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, O
}
}
@Subscribe(sticky = false, threadMode = ThreadMode.MAIN)
fun onEvent(event: XBaseEvent?) {
when (event?.name) {
XEventConfig.APPLY_REFUND_SUCCESS -> {
// 申请退款成功 刷新页面
binding.rlOrderDetail.autoRefresh()
}
}
override fun onDoBack() {
vm.commitWidgetBuriedPoint("return_key")
XPageManager.pop(null)
}
override fun onContractPickupPoint() {
vm.commitWidgetBuriedPoint("call_up")
}
override fun onGotoMarketingDetail() {
vm.commitWidgetBuriedPoint("activity_icon")
}
override fun onApplyRefundSuccess() {
// 申请退款成功 刷新页面
binding.rlOrderDetail.autoRefresh()
}
override fun onContractSeller() {
vm.commitWidgetBuriedPoint("contact_seller")
}
}
......@@ -12,7 +12,8 @@ import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.LinearLayoutManager
import com.tbruyelle.rxpermissions3.RxPermissions
import com.yidian.bcommon.constant.XEventConfig
import com.yidian.bcommon.constant.XBirdPageConstants
import com.yidian.bcommon.constant.XRouterPathConstants
import com.yidian.bcommon.utils.ToastUtils
import com.yidian.bcommon.widget.CommonHintDialog
import com.yidian.shenghuoquan.buserorder.R
......@@ -21,8 +22,7 @@ import com.yidian.shenghuoquan.buserorder.databinding.BorderViewOrderCommodityIn
import com.yidian.shenghuoquan.buserorder.dto.OrderDetailDto
import com.yidian.shenghuoquan.buserorder.manager.OrderStatus
import com.yidian.shenghuoquan.buserorder.viewmodel.OrderCommodityInfoViewModel
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageManager
/**
* author: yinjiacheng
......@@ -41,6 +41,7 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs:
)
private val adapter by lazy { OrderDetailCommodityListAdapter(null) }
private val vm by lazy { OrderCommodityInfoViewModel() }
private var callback: OnOrderCommodityInfoCallback? = null
init {
initRecycleView()
......@@ -75,8 +76,8 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs:
vm.applyRefundResult.observe(context as LifecycleOwner, {
if (it) {
ToastUtils.showShortSafe("已申请退款")
// 刷新页面
XEventManager.post(XBaseEvent(XEventConfig.APPLY_REFUND_SUCCESS, null))
// 回调申请退款成功
callback?.onApplyRefundSuccess()
}
})
// 监听点击联系卖家
......@@ -91,6 +92,15 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs:
ToastUtils.showShortSafe("请在设置里同意相关权限")
}
}
// 回调联系卖家
callback?.onContractSeller()
})
// 监听点击跳转活动详情页
vm.gotoMarketingDetail.observe(context as LifecycleOwner, {
val pageUrl = XBirdPageConstants.FIGHT_ORDER_EVENT_DETAILS + "?marketing_id=${it}"
XPageManager.push(XRouterPathConstants.COMMON_WEB_VIEW_ACTIVITY, hashMapOf(Pair(XBirdPageConstants.PAGE_URL, pageUrl)))
// 回调跳转活动详情
callback?.onGotoMarketingDetail()
})
}
......@@ -99,10 +109,28 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs:
* @param status 订单状态 确认订单时固定传ORDER_STATUS_WAIT_PAY
* @param info 商品信息
*/
fun setCommodityInfo(status: OrderStatus, info: OrderDetailDto) {
fun setCommodityInfo(status: OrderStatus, info: OrderDetailDto, callback: OnOrderCommodityInfoCallback?) {
binding.vm = vm
binding.status = status
binding.data = info
this.callback = callback
adapter.updateData(info.mergeOrderItemList)
}
interface OnOrderCommodityInfoCallback {
/**
* 跳转活动详情
*/
fun onGotoMarketingDetail()
/**
* 申请退款成功
*/
fun onApplyRefundSuccess()
/**
* 联系卖家
*/
fun onContractSeller()
}
}
......@@ -33,6 +33,7 @@ class OrderPickupPointInfoView @JvmOverloads constructor(context: Context, attrs
true
)
private val vm by lazy { OrderPickupPointViewModel() }
private var callback: OnOrderPickupPointInfoCallback? = null
init {
registerUIEvent()
......@@ -54,6 +55,7 @@ class OrderPickupPointInfoView @JvmOverloads constructor(context: Context, attrs
ToastUtils.showShortSafe("请在设置里同意相关权限")
}
}
callback?.onContractPickupPoint()
})
}
......@@ -61,8 +63,16 @@ class OrderPickupPointInfoView @JvmOverloads constructor(context: Context, attrs
* 设置自提点
* @param info 自提点信息
*/
fun setPickupPoint(info: PlaceList?) {
fun setPickupPoint(info: PlaceList?, callback: OnOrderPickupPointInfoCallback?) {
binding.vm = vm
binding.data = info
this.callback = callback
}
interface OnOrderPickupPointInfoCallback {
/**
* 联系自提点
*/
fun onContractPickupPoint()
}
}
......@@ -2,12 +2,9 @@ package com.yidian.shenghuoquan.buserorder.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yidian.bcommon.constant.XBirdPageConstants
import com.yidian.bcommon.constant.XRouterPathConstants
import com.yidian.bcommon.mvvm.BaseViewModel
import com.yidian.shenghuoquan.buserorder.http.OrderRemoteDataSource
import com.yidian.shenghuoquan.buserorder.http.callback.IApplyRefundCallback
import com.yidian.xpage.XPageManager
/**
* author: yinjiacheng
......@@ -25,6 +22,9 @@ class OrderCommodityInfoViewModel : BaseViewModel() {
private val _contractSeller = MutableLiveData<String>()
val contractSeller: LiveData<String> = _contractSeller
private val _gotoMarketingDetail = MutableLiveData<Long>()
val gotoMarketingDetail: LiveData<Long> = _gotoMarketingDetail
/**
* 申请退款
* @param orderId 订单id
......@@ -63,7 +63,6 @@ class OrderCommodityInfoViewModel : BaseViewModel() {
* @param marketingId 活动id
*/
fun gotoMarketingDetail(marketingId: Long) {
val pageUrl = XBirdPageConstants.FIGHT_ORDER_EVENT_DETAILS + "?marketing_id=${marketingId}"
XPageManager.push(XRouterPathConstants.COMMON_WEB_VIEW_ACTIVITY, hashMapOf(Pair(XBirdPageConstants.PAGE_URL, pageUrl)))
_gotoMarketingDetail.value = marketingId
}
}
......@@ -3,9 +3,12 @@ package com.yidian.shenghuoquan.buserorder.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yidian.bcommon.mvvm.BaseViewModel
import com.yidian.bcommon.utils.CPointUtils
import com.yidian.shenghuoquan.buserorder.dto.OrderDetailDto
import com.yidian.shenghuoquan.buserorder.http.OrderRemoteDataSource
import com.yidian.shenghuoquan.buserorder.http.callback.IGetOrderDetailCallback
import org.json.JSONObject
import timber.log.Timber
/**
* author: yinjiacheng
......@@ -23,6 +26,11 @@ class OrderDetailViewModel : BaseViewModel() {
fun requestOrderDetail(orderId: String) {
OrderRemoteDataSource.getOrderDetail(object : IGetOrderDetailCallback {
override fun getOrderDetailSuccess(result: OrderDetailDto?) {
if (_orderDetailData.value == null) {
_orderDetailData.value = result
// 订单详情页面曝光埋点只上报一次
commitPageBuriedPoint()
}
_orderDetailData.value = result
}
......@@ -31,4 +39,87 @@ class OrderDetailViewModel : BaseViewModel() {
}
}, hashMapOf("order_id" to orderId, "business_from" to "2"))
}
/**
* 页面浏览的埋点
* 页面可见且有业务数据时上传
*/
private fun commitPageBuriedPoint() {
val data = _orderDetailData.value
// 遍历商品列表
val skuIdStr = StringBuilder()
val skuNameStr = StringBuilder()
data?.mergeOrderItemList?.forEachIndexed { index, item ->
skuIdStr.append(item.goodsSkuId)
skuNameStr.append(item.goodsName)
if (index < data.mergeOrderItemList.size - 1) {
skuIdStr.append(",")
skuNameStr.append(",")
}
}
// 埋点数据包装
val jsonObject = JSONObject()
jsonObject.put("eventName", "EXPOSE_PAGE")
val contextJsonObject = JSONObject()
contextJsonObject.put("page", "ORDER_DETAIL_PAGE")
val smallOrderInfoJsonObject = JSONObject()
smallOrderInfoJsonObject.put("order_id", data?.orderId)
smallOrderInfoJsonObject.put("marketing_id", data?.marketingId)
smallOrderInfoJsonObject.put("marketing_name", data?.marketingName)
smallOrderInfoJsonObject.put("marketing_type", "SPELL_MEAL")
smallOrderInfoJsonObject.put("goods_sku_id", skuIdStr.toString())
smallOrderInfoJsonObject.put("goods_sku_name", skuNameStr.toString())
contextJsonObject.put("small_order_info", smallOrderInfoJsonObject)
jsonObject.put("contextMap", contextJsonObject)
val propertiesJsonObject = JSONObject()
propertiesJsonObject.put("event_id", "SHQNG_R_1628750600250")
jsonObject.put("propertiesMap", propertiesJsonObject)
jsonObject.put("logType", 1)
CPointUtils.performCommitLog(jsonObject)
Timber.tag("BUserOrderBuriedPoint").d("commit order detail page log: $jsonObject")
}
/**
* 点击返回按钮的埋点
*/
fun commitWidgetBuriedPoint(widgetName: String) {
val data = _orderDetailData.value
// 遍历商品列表
val skuIdStr = StringBuilder()
val skuNameStr = StringBuilder()
data?.mergeOrderItemList?.forEachIndexed { index, item ->
skuIdStr.append(item.goodsSkuId)
skuNameStr.append(item.goodsName)
if (index < data.mergeOrderItemList.size - 1) {
skuIdStr.append(",")
skuNameStr.append(",")
}
}
// 埋点数据包装
val jsonObject = JSONObject()
jsonObject.put("eventName", "CLICK_WIDGET")
val contextJsonObject = JSONObject()
contextJsonObject.put("page", "ORDER_DETAIL_PAGE")
val smallOrderInfoJsonObject = JSONObject()
smallOrderInfoJsonObject.put("order_id", data?.orderId)
smallOrderInfoJsonObject.put("marketing_id", data?.marketingId)
smallOrderInfoJsonObject.put("marketing_name", data?.marketingName)
smallOrderInfoJsonObject.put("marketing_type", "SPELL_MEAL")
smallOrderInfoJsonObject.put("goods_sku_id", skuIdStr.toString())
smallOrderInfoJsonObject.put("goods_sku_name", skuNameStr.toString())
contextJsonObject.put("small_order_info", smallOrderInfoJsonObject)
jsonObject.put("contextMap", contextJsonObject)
val entitiesJsonObject = JSONObject()
val widgetInfoJsonObject = JSONObject()
widgetInfoJsonObject.put("widget_type", "BUTTON")
widgetInfoJsonObject.put("widget_name", widgetName)
entitiesJsonObject.put("widget_info", widgetInfoJsonObject)
jsonObject.put("entitiesMap", entitiesJsonObject)
val propertiesJsonObject = JSONObject()
propertiesJsonObject.put("event_id", "SHQNG_R_1628751452736")
jsonObject.put("propertiesMap", propertiesJsonObject)
jsonObject.put("logType", 1)
CPointUtils.performCommitLog(jsonObject)
Timber.tag("BUserOrderBuriedPoint").d("commit order detail widget log: $jsonObject")
}
}
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