Commit c6be79c1 authored by yinjiacheng's avatar yinjiacheng

add 订单详情页埋点

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