DoggyZhang 3 недель назад
Родитель
Сommit
ecff9ca090
24 измененных файлов с 344 добавлено и 35 удалено
  1. 2 0
      app/src/main/java/com/adealink/weparty/module/order/data/OrderDetailInfo.kt
  2. 1 0
      app/src/main/res/values-in/strings.xml
  3. 1 0
      app/src/main/res/values-zh/strings.xml
  4. 1 0
      app/src/main/res/values/strings.xml
  5. 3 3
      module/order/src/main/java/com/adealink/weparty/order/PlaymateOrderListActivity.kt
  6. 18 3
      module/order/src/main/java/com/adealink/weparty/order/adapter/PlaymateOrderListItemViewBinder.kt
  7. 11 1
      module/order/src/main/java/com/adealink/weparty/order/adapter/UserOrderListItemViewBinder.kt
  8. 13 1
      module/order/src/main/java/com/adealink/weparty/order/detail/OrderDetailActivity.kt
  9. 2 2
      module/order/src/main/java/com/adealink/weparty/order/dialog/CreateOrderDialog.kt
  10. 40 4
      module/order/src/main/java/com/adealink/weparty/order/qrcode/QRCodeOrderActivity.kt
  11. 36 5
      module/order/src/main/java/com/adealink/weparty/order/qrcode/QRCodeOrderDialog.kt
  12. 1 0
      module/order/src/main/java/com/adealink/weparty/order/refund/RefundActivity.kt
  13. 1 0
      module/order/src/main/java/com/adealink/weparty/order/refund/comp/PlaymateRefundCustomerComp.kt
  14. 8 2
      module/order/src/main/java/com/adealink/weparty/order/util/UIUtil.kt
  15. 2 0
      module/order/src/main/java/com/adealink/weparty/order/viewmodel/UserOrderViewModel.kt
  16. 67 1
      module/order/src/main/res/layout/activity_order_detail.xml
  17. 50 0
      module/order/src/main/res/layout/activity_qrcode_order.xml
  18. 67 2
      module/order/src/main/res/layout/dialog_qrcode_create_order.xml
  19. 8 5
      module/order/src/main/res/layout/layout_playmate_order_list_item.xml
  20. 12 0
      module/order/src/main/res/layout/layout_user_order_list_item.xml
  21. 0 1
      module/order/src/main/res/values-in/strings.xml
  22. 0 1
      module/order/src/main/res/values-zh/strings.xml
  23. 0 1
      module/order/src/main/res/values/strings.xml
  24. 0 3
      module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateListData.kt

+ 2 - 0
app/src/main/java/com/adealink/weparty/module/order/data/OrderDetailInfo.kt

@@ -158,6 +158,8 @@ data class OrderDetailInfo(
     @SerializedName("status") var status: Int, //订单状态
     @SerializedName("createTime") val createTime: Long, //下单时间(时间戳, 毫秒)
     @GsonNullable
+    @SerializedName("totalAmount") val totalAmount: Float?, //订单价格
+    @GsonNullable
     @SerializedName("customerRemark") val customerRemark: String?, //客户备注
     @GsonNullable
     @SerializedName("star") var star: Float?, //评分

+ 1 - 0
app/src/main/res/values-in/strings.xml

@@ -367,4 +367,5 @@
     <string name="common_expand">perluas</string>
     <string name="common_select_photo">Pilih foto</string>
     <string name="common_select_video">Pilih video</string>
+    <string name="order_discount">Diskon</string>
 </resources>

+ 1 - 0
app/src/main/res/values-zh/strings.xml

@@ -369,4 +369,5 @@
     <string name="common_select_video">选择视频</string>
     <string name="common_price_discount">%s%% 折扣</string>
     <string name="common_price_discount_new_only">仅限新用户|%s%% 折扣</string>
+    <string name="order_discount">折扣</string>
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -376,4 +376,5 @@
     <string name="common_select_video">Select video</string>
     <string name="common_price_discount">%s%% OFF</string>
     <string name="common_price_discount_new_only">New Only | %s%% OFF</string>
+    <string name="order_discount">Discount</string>
 </resources>

+ 3 - 3
module/order/src/main/java/com/adealink/weparty/order/PlaymateOrderListActivity.kt

@@ -20,7 +20,7 @@ import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceIte
 import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.commonui.widget.CommonDialog
 import com.adealink.weparty.module.order.Order
-import com.adealink.weparty.order.adapter.PlaymateListItemViewBinder
+import com.adealink.weparty.order.adapter.PlaymateOrderListItemViewBinder
 import com.adealink.weparty.order.data.PlaymateOrderListItemData
 import com.adealink.weparty.order.databinding.ActivityPlaymateOrderListBinding
 import com.adealink.weparty.order.viewmodel.OrderViewModelFactory
@@ -32,7 +32,7 @@ import com.adealink.weparty.R as APP_R
 
 @RouterUri(path = [Order.PlaymateList.PATH], desc = "陪玩接单列表")
 class PlaymateOrderListActivity : BaseActivity(),
-    PlaymateListItemViewBinder.OnPlaymateOrderListener {
+    PlaymateOrderListItemViewBinder.OnPlaymateOrderListener {
 
     companion object {
         private const val TAG = "PlaymateOrderListActivity"
@@ -72,7 +72,7 @@ class PlaymateOrderListActivity : BaseActivity(),
             }
         })
 
-        listAdapter.register(PlaymateListItemViewBinder(this))
+        listAdapter.register(PlaymateOrderListItemViewBinder(this))
         binding.rvOrder.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
         binding.rvOrder.adapter = listAdapter
         binding.rvOrder.addItemDecoration(

+ 18 - 3
module/order/src/main/java/com/adealink/weparty/order/adapter/PlaymateListItemViewBinder.kt → module/order/src/main/java/com/adealink/weparty/order/adapter/PlaymateOrderListItemViewBinder.kt

@@ -6,20 +6,22 @@ import android.view.ViewGroup
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.util.formatTime
 import com.adealink.frame.util.onClick
+import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.commonui.ext.sp
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.module.order.data.OrderStatus
 import com.adealink.weparty.module.order.util.setUserOrderStatusText
 import com.adealink.weparty.order.data.PlaymateOrderListItemData
 import com.adealink.weparty.order.databinding.LayoutPlaymateOrderListItemBinding
+import com.adealink.weparty.order.util.getOrderAllCost
 import com.adealink.weparty.util.TIME_FORMAT_DMY_HMS
-import com.adealink.weparty.util.formatNumberStr
 import com.adealink.weparty.util.getGenderResource
 import com.adealink.weparty.R as APP_R
 
-class PlaymateListItemViewBinder(
+class PlaymateOrderListItemViewBinder(
     val listener: OnPlaymateOrderListener
 ) : ItemViewBinder<PlaymateOrderListItemData, BindingViewHolder<LayoutPlaymateOrderListItemBinding>>() {
 
@@ -34,7 +36,20 @@ class PlaymateListItemViewBinder(
         holder.binding.tvCategory.text = item.data.categoryName
         holder.binding.tvOrderId.text = item.data.orderId
 
-        holder.binding.tvPrice.text = formatNumberStr(item.data.price, false)
+        val totalAmount = item.data.totalAmount
+        val targetAmount = item.data.price * item.data.purchaseQty
+        if (totalAmount != null && totalAmount > 0 && totalAmount < targetAmount) {
+            holder.binding.vDiscount.show()
+        } else {
+            holder.binding.vDiscount.gone()
+        }
+        holder.binding.tvPrice.text = getOrderAllCost(
+            item.data.price,
+            item.data.purchaseQty,
+            totalAmount,
+            16.sp(),
+            14.4f.dp()
+        )
         holder.binding.tvCount.text = "${item.data.unit} x${item.data.purchaseQty}"
 
         holder.binding.ivAvatar.setImageUrl(item.data.avatar)

+ 11 - 1
module/order/src/main/java/com/adealink/weparty/order/adapter/UserOrderListItemViewBinder.kt

@@ -46,9 +46,18 @@ class UserOrderListItemViewBinder(
         holder.binding.tvDesc.text = item.data.categoryName
         holder.binding.tvPrice.text = formatNumberStr(item.data.price, false)
         holder.binding.tvCount.text = "${item.data.unit} x${item.data.purchaseQty}"
+
+        val totalAmount = item.data.totalAmount
+        val targetAmount = item.data.price * item.data.purchaseQty
+        if (totalAmount != null && totalAmount > 0 && totalAmount < targetAmount) {
+            holder.binding.vDiscount.show()
+        } else {
+            holder.binding.vDiscount.gone()
+        }
         holder.binding.tvOrderAllCost.text = getOrderAllCost(
             item.data.price,
             item.data.purchaseQty,
+            item.data.totalAmount,
             16.sp(),
             16.dp()
         )
@@ -61,7 +70,8 @@ class UserOrderListItemViewBinder(
                 holder.binding.btnCancel.gone()
                 holder.binding.btnEvaluate.gone()
                 holder.binding.tvRefunded.show()
-                holder.binding.tvRefunded.text = getCompatString(R.string.order_refunded_pending_review)
+                holder.binding.tvRefunded.text =
+                    getCompatString(R.string.order_refunded_pending_review)
             }
 
             status == OrderStatus.CREATE_ORDER -> {

+ 13 - 1
module/order/src/main/java/com/adealink/weparty/order/detail/OrderDetailActivity.kt

@@ -52,6 +52,7 @@ import com.adealink.weparty.order.viewmodel.OrderViewModelFactory
 import com.adealink.weparty.order.viewmodel.UserOrderViewModel
 import com.adealink.weparty.util.TIME_FORMAT_DMY_HMS
 import com.adealink.weparty.util.applyImmersive
+import com.adealink.weparty.util.formatNumber
 import com.adealink.weparty.util.goImagePreviewActivity
 import okhttp3.internal.format
 import kotlin.math.max
@@ -182,8 +183,18 @@ class OrderDetailActivity : BaseActivity() {
         binding.tvOrderName.text = data?.order?.nickname
 
         binding.tvProductTypeDetail.text = data?.order?.categoryName
-        binding.tvProductPriceDetail.text = data?.order?.price?.toString()
+        binding.tvProductPriceDetail.text = formatNumber(data?.order?.price ?: 0f, false)
         binding.tvOrderCountDetail.text = "${data?.order?.unit} x${data?.order?.purchaseQty}"
+
+        val totalAmount = data?.order?.totalAmount
+        val targetAmount = (data?.order?.price ?: 0f) * (data?.order?.purchaseQty ?: 0)
+        if (totalAmount != null && totalAmount > 0 && totalAmount < targetAmount) {
+            binding.clDiscount.show()
+            binding.tvOrderDiscountDetail.text = formatNumber(-(targetAmount - totalAmount), false)
+        } else {
+            binding.clDiscount.gone()
+        }
+
         if (data?.order?.customerRemark.isNullOrEmpty()) {
             binding.clOrderRemark.gone()
         } else {
@@ -197,6 +208,7 @@ class OrderDetailActivity : BaseActivity() {
             getOrderAllCost(
                 data?.order?.price ?: 0f,
                 data?.order?.purchaseQty ?: 0,
+                data?.order?.totalAmount,
                 16.sp(),
                 16.dp()
             )

+ 2 - 2
module/order/src/main/java/com/adealink/weparty/order/dialog/CreateOrderDialog.kt

@@ -171,13 +171,13 @@ class CreateOrderDialog : BottomDialogFragment(R.layout.dialog_create_order) {
             //首单第一个免费
             binding.tvTotalDetail.text = formatNumberStr(
                 finalPrice.discountPrice +
-                        (playmateData?.price ?: 0f) * max(orderCount, 0), false
+                        (playmateData?.price ?: 0f) * max((orderCount - 1), 0), false
             )
 
         } else {
             binding.clDiscount.gone()
             binding.tvTotalDetail.text = formatNumberStr(
-                (playmateData?.price ?: 0f) * orderCount, false
+                (playmateData?.price ?: 0f) * (orderCount - 1), false
             )
         }
     }

+ 40 - 4
module/order/src/main/java/com/adealink/weparty/order/qrcode/QRCodeOrderActivity.kt

@@ -18,16 +18,22 @@ import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.NumberIncreaseView
 import com.adealink.weparty.constant.ORDER_REMARK_MAX_LENGTH
 import com.adealink.weparty.module.order.Order
+import com.adealink.weparty.module.order.OrderModule
 import com.adealink.weparty.module.order.data.QRCodeOrder
 import com.adealink.weparty.module.order.data.QRCodeOrderDetail
+import com.adealink.weparty.module.order.data.discountLD
+import com.adealink.weparty.module.order.data.getFinalPrice
 import com.adealink.weparty.module.playmate.Playmate
 import com.adealink.weparty.order.R
 import com.adealink.weparty.order.databinding.ActivityQrcodeOrderBinding
 import com.adealink.weparty.order.viewmodel.OrderViewModelFactory
 import com.adealink.weparty.order.viewmodel.QRCodeOrderViewModel
 import com.adealink.weparty.util.applyImmersive
+import com.adealink.weparty.util.formatNumber
 import com.adealink.weparty.util.formatNumberStr
 import com.adealink.weparty.util.formatStar
+import kotlin.math.max
+import com.adealink.weparty.R as APP_R
 
 @RouterUri(
     path = [
@@ -75,8 +81,16 @@ class QRCodeOrderActivity : BaseActivity() {
         }
     }
 
+    override fun observeViewModel() {
+        super.observeViewModel()
+        discountLD.observe(this) {
+            updatePrice()
+        }
+    }
+
     override fun loadData() {
         super.loadData()
+        OrderModule.queryDiscountInfo()
         val qrCode = qrCode
         if (qrCode.isNullOrEmpty()) {
             showToast(R.string.order_qrcode_invalid)
@@ -123,10 +137,32 @@ class QRCodeOrderActivity : BaseActivity() {
             binding.vNumber.setNumber(orderCount)
             binding.tvNumber.gone()
         }
-        binding.vBottom.vPrice.setPrice(
-            (orderDetail?.price ?: 0f) * orderCount,
-            ""
-        )
+        updatePrice()
+    }
+
+    private fun updatePrice(){
+        val finalPrice = getFinalPrice(orderDetail?.price)
+        if (finalPrice.hasDiscount()) {
+            binding.clDiscount.show()
+            binding.vDiscount.text = getCompatString(
+                APP_R.string.common_price_discount_new_only,
+                formatNumber(finalPrice.discountPercent, true)
+            )
+            binding.vPriceDiscount.setDiscount(
+                -finalPrice.discount, null
+            )
+            //首单第一个免费
+            binding.vBottom.vPrice.setPrice(
+                finalPrice.discountPrice + (orderDetail?.price ?: 0f) * max(orderCount - 1, 0),
+                null
+            )
+        } else {
+            binding.clDiscount.gone()
+            binding.vBottom.vPrice.setPrice(
+                (orderDetail?.price ?: 0f) * orderCount,
+                null
+            )
+        }
     }
 
     private fun goCategoryId() {

+ 36 - 5
module/order/src/main/java/com/adealink/weparty/order/qrcode/QRCodeOrderDialog.kt

@@ -2,24 +2,31 @@ package com.adealink.weparty.order.qrcode
 
 import android.annotation.SuppressLint
 import androidx.fragment.app.viewModels
+import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
 import com.adealink.frame.util.onClick
+import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.module.im.IM
+import com.adealink.weparty.module.order.OrderModule
 import com.adealink.weparty.module.order.data.QRCodeOrder
 import com.adealink.weparty.module.order.data.QRCodeOrderDetail
+import com.adealink.weparty.module.order.data.getFinalPrice
 import com.adealink.weparty.module.wallet.WalletModule
 import com.adealink.weparty.module.wallet.data.Currency
 import com.adealink.weparty.order.R
 import com.adealink.weparty.order.databinding.DialogQrcodeCreateOrderBinding
 import com.adealink.weparty.order.viewmodel.OrderViewModelFactory
 import com.adealink.weparty.order.viewmodel.QRCodeOrderViewModel
+import com.adealink.weparty.util.formatNumber
 import com.adealink.weparty.util.formatNumberStr
+import kotlin.math.max
+import com.adealink.weparty.R as APP_R
 
 class QRCodeOrderDialog : BottomDialogFragment(R.layout.dialog_qrcode_create_order) {
 
@@ -51,20 +58,43 @@ class QRCodeOrderDialog : BottomDialogFragment(R.layout.dialog_qrcode_create_ord
         binding.tvCategory.text = orderData?.categoryName
         binding.ivAvatar.setImageUrl(orderData?.avatar)
         binding.tvName.text = orderData?.nickname
+
         binding.tvPrice.text =
             "${formatNumberStr((orderData?.price ?: 0f), false)}/${orderData?.unit ?: ""}"
-
         binding.tvCount.show()
         binding.tvCount.text = orderCount.toString()
 
-        binding.tvTotalDetail.text = formatNumberStr(
-            (orderData?.price ?: 0f) * (orderCount ?: 0), false
-        )
-
         binding.tvRemarkInput.setText(remark)
         binding.btnPay.onClick {
             pay()
         }
+        updatePrice()
+    }
+
+    private fun updatePrice(){
+
+        val finalPrice = getFinalPrice(orderData?.price)
+        if (finalPrice.hasDiscount()) {
+            binding.clDiscount.show()
+            binding.vDiscount.text = getCompatString(
+                APP_R.string.common_price_discount_new_only,
+                formatNumber(finalPrice.discountPercent, true)
+            )
+            binding.vPriceDiscount.setDiscount(
+                -finalPrice.discount, null
+            )
+            //首单第一个免费
+            binding.tvTotalDetail.text = formatNumberStr(
+                finalPrice.discountPrice +
+                        (orderData?.price ?: 0f) * max((orderCount ?: 0) - 1, 0), false
+            )
+
+        } else {
+            binding.clDiscount.gone()
+            binding.tvTotalDetail.text = formatNumberStr(
+                (orderData?.price ?: 0f) * (orderCount ?: 0), false
+            )
+        }
     }
 
     override fun observeViewModel() {
@@ -76,6 +106,7 @@ class QRCodeOrderDialog : BottomDialogFragment(R.layout.dialog_qrcode_create_ord
 
     override fun loadData() {
         super.loadData()
+        OrderModule.queryDiscountInfo()
         walletViewModel?.refreshWalletData()
     }
 

+ 1 - 0
module/order/src/main/java/com/adealink/weparty/order/refund/RefundActivity.kt

@@ -213,6 +213,7 @@ class RefundActivity : BaseActivity() {
             getOrderAllCost(
                 data?.order?.price ?: 0f,
                 data?.order?.purchaseQty ?: 0,
+                data?.order?.totalAmount,
                 12.sp(),
                 12.dp()
             )

+ 1 - 0
module/order/src/main/java/com/adealink/weparty/order/refund/comp/PlaymateRefundCustomerComp.kt

@@ -87,6 +87,7 @@ class PlaymateRefundCustomerComp(
         binding.tvTotalCostDetail.text = getOrderAllCost(
             data.order.price,
             data.order.purchaseQty,
+            data.order.totalAmount,
             12.sp(),
             12.dp()
         )

+ 8 - 2
module/order/src/main/java/com/adealink/weparty/order/util/UIUtil.kt

@@ -14,8 +14,14 @@ import com.adealink.weparty.util.formatNumberStr
 import com.adealink.weparty.R as APP_R
 
 
-fun getOrderAllCost(price: Float, count: Int, priceTextSize: Int, iconSize: Int): SpannableStringBuilder {
-    val cost = formatNumberStr(price * count, omitted = false)
+fun getOrderAllCost(
+    price: Float,
+    count: Int,
+    totalCost: Float?,
+    priceTextSize: Int,
+    iconSize: Int
+): SpannableStringBuilder {
+    val cost = formatNumberStr(totalCost ?: (price * count), omitted = false)
     val text = getCompatString(R.string.order_all_cost, cost)
     return SpannableStringBuilder(text).apply {
         findAndSetSpan(

+ 2 - 0
module/order/src/main/java/com/adealink/weparty/order/viewmodel/UserOrderViewModel.kt

@@ -8,6 +8,7 @@ import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.frame.network.data.PageReq
 import com.adealink.weparty.App
+import com.adealink.weparty.module.order.OrderModule
 import com.adealink.weparty.module.order.data.OrderAction
 import com.adealink.weparty.module.order.data.OrderDetailData
 import com.adealink.weparty.module.order.data.OrderDetailInfo
@@ -85,6 +86,7 @@ class UserOrderViewModel : BaseViewModel() {
                 }
 
                 is Rlt.Success -> {
+                    OrderModule.queryDiscountInfo()
                     val nextData = queryOrderDetail(data.orderId)
                     if (nextData != null) {
                         orderDetailLD.send(nextData)

+ 67 - 1
module/order/src/main/res/layout/activity_order_detail.xml

@@ -318,6 +318,72 @@
 
                 </androidx.constraintlayout.widget.ConstraintLayout>
 
+                <!-- 折扣 -->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_discount"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:minHeight="30dp"
+                    android:paddingVertical="6dp"
+                    app:layout_constraintTop_toBottomOf="@id/cl_order_count">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_order_discount"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:includeFontPadding="false"
+                        android:text="@string/order_discount"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toStartOf="@id/cl_order_discount_detail"
+                        app:layout_constraintHorizontal_weight="2"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.constraintlayout.widget.ConstraintLayout
+                        android:id="@+id/cl_order_discount_detail"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintHorizontal_bias="1"
+                        app:layout_constraintHorizontal_weight="3"
+                        app:layout_constraintStart_toEndOf="@id/tv_order_discount"
+                        app:layout_constraintTop_toTopOf="parent">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            android:id="@+id/iv_order_discount_detail"
+                            android:layout_width="11dp"
+                            android:layout_height="11dp"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintEnd_toStartOf="@id/tv_order_discount_detail"
+                            app:layout_constraintHorizontal_bias="1"
+                            app:layout_constraintHorizontal_chainStyle="packed"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:srcCompat="@drawable/common_wallet_coin_ic" />
+
+                        <androidx.appcompat.widget.AppCompatTextView
+                            android:id="@+id/tv_order_discount_detail"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginStart="2dp"
+                            android:gravity="end"
+                            android:includeFontPadding="false"
+                            android:textColor="@color/color_FF1D2129"
+                            android:textSize="12sp"
+                            app:layout_constrainedWidth="true"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@id/iv_order_discount_detail"
+                            app:layout_constraintTop_toTopOf="parent"
+                            tools:text="-1000" />
+
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
                 <!-- 备注 -->
                 <androidx.constraintlayout.widget.ConstraintLayout
                     android:id="@+id/cl_order_remark"
@@ -325,7 +391,7 @@
                     android:layout_height="wrap_content"
                     android:minHeight="30dp"
                     android:paddingVertical="6dp"
-                    app:layout_constraintTop_toBottomOf="@id/cl_order_count">
+                    app:layout_constraintTop_toBottomOf="@id/cl_discount">
 
                     <androidx.appcompat.widget.AppCompatTextView
                         android:id="@+id/tv_order_remark"

+ 50 - 0
module/order/src/main/res/layout/activity_qrcode_order.xml

@@ -247,6 +247,56 @@
 
                 </androidx.constraintlayout.widget.ConstraintLayout>
 
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_discount"
+                    android:layout_width="match_parent"
+                    android:layout_height="38dp"
+                    android:visibility="gone"
+                    app:layout_constraintTop_toBottomOf="@id/cl_count"
+                    tools:visibility="visible">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginHorizontal="8dp"
+                        android:ellipsize="end"
+                        android:fontFamily="@font/poppins_semibold"
+                        android:includeFontPadding="false"
+                        android:singleLine="true"
+                        android:text="@string/order_discount"
+                        android:textColor="@color/color_FF1D2129"
+                        android:textSize="12sp"
+                        app:layout_constrainedWidth="true"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toStartOf="@id/v_price_discount"
+                        app:layout_constraintHorizontal_bias="0"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/v_discount"
+                        style="@style/CommonDiscountPriceView"
+                        android:layout_width="wrap_content"
+                        android:layout_marginEnd="4dp"
+                        app:layout_constraintBottom_toBottomOf="@id/v_price_discount"
+                        app:layout_constraintEnd_toStartOf="@id/v_price_discount"
+                        app:layout_constraintTop_toTopOf="@id/v_price_discount"
+                        tools:text="New Only | 90% OFF" />
+
+                    <com.adealink.weparty.module.playmate.widget.PriceView
+                        android:id="@+id/v_price_discount"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:price_icon_size="16dp"
+                        app:price_text_bold="true"
+                        app:price_text_size="16sp" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
             </androidx.constraintlayout.widget.ConstraintLayout>
 
             <androidx.constraintlayout.widget.ConstraintLayout

+ 67 - 2
module/order/src/main/res/layout/dialog_qrcode_create_order.xml

@@ -68,12 +68,29 @@
             android:paddingHorizontal="12dp"
             app:layout_constraintTop_toBottomOf="@id/tv_name">
 
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_price_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:fontFamily="@font/poppins_semibold"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:singleLine="true"
+                android:text="@string/order_product_price"
+                android:textColor="@color/color_FF1D2129"
+                android:textSize="14sp"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
             <androidx.appcompat.widget.AppCompatImageView
                 android:id="@+id/iv_coin"
                 android:layout_width="12dp"
                 android:layout_height="12dp"
+                android:layout_marginStart="6dp"
                 app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintStart_toEndOf="@id/tv_price_title"
                 app:layout_constraintTop_toTopOf="parent"
                 app:srcCompat="@drawable/common_wallet_coin_ic" />
 
@@ -107,12 +124,60 @@
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/cl_discount"
+            android:layout_width="match_parent"
+            android:layout_height="49dp"
+            android:layout_marginTop="13dp"
+            android:paddingHorizontal="12dp"
+            android:visibility="gone"
+            app:layout_constraintTop_toBottomOf="@id/cl_price"
+            tools:visibility="visible">
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_discount_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:fontFamily="@font/poppins_semibold"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:singleLine="true"
+                android:text="@string/order_discount"
+                android:textColor="@color/color_FF1D2129"
+                android:textSize="14sp"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/v_discount"
+                style="@style/CommonDiscountPriceView"
+                android:layout_width="wrap_content"
+                android:layout_marginStart="6dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toEndOf="@id/tv_discount_title"
+                app:layout_constraintTop_toTopOf="parent"
+                tools:text="New Only | 90% OFF" />
+
+            <com.adealink.weparty.module.playmate.widget.PriceView
+                android:id="@+id/v_price_discount"
+                style="@style/CommonPriceView"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:price_icon_size="16dp"
+                app:price_text_bold="true"
+                app:price_text_size="16sp" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
         <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/cl_total"
             android:layout_width="match_parent"
             android:layout_height="50dp"
             android:paddingHorizontal="12dp"
-            app:layout_constraintTop_toBottomOf="@id/cl_price">
+            app:layout_constraintTop_toBottomOf="@id/cl_discount">
 
             <androidx.appcompat.widget.AppCompatTextView
                 android:id="@+id/tv_total"

+ 8 - 5
module/order/src/main/res/layout/layout_playmate_order_list_item.xml

@@ -120,14 +120,17 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toTopOf="parent">
 
-            <androidx.appcompat.widget.AppCompatImageView
-                android:layout_width="14dp"
-                android:layout_height="14dp"
-                android:layout_marginEnd="2dp"
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/v_discount"
+                style="@style/CommonDiscountPriceView"
+                android:layout_width="wrap_content"
+                android:layout_marginEnd="4dp"
+                android:text="@string/order_discount"
+                android:visibility="gone"
                 app:layout_constraintBottom_toBottomOf="@id/tv_price"
                 app:layout_constraintEnd_toStartOf="@id/tv_price"
                 app:layout_constraintTop_toTopOf="@id/tv_price"
-                app:srcCompat="@drawable/common_wallet_coin_ic" />
+                tools:visibility="visible" />
 
             <androidx.appcompat.widget.AppCompatTextView
                 android:id="@+id/tv_price"

+ 12 - 0
module/order/src/main/res/layout/layout_user_order_list_item.xml

@@ -257,6 +257,18 @@
             app:barrierDirection="start"
             app:constraint_referenced_ids="tv_order_all_cost" />
 
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/v_discount"
+            style="@style/CommonDiscountPriceView"
+            android:layout_width="wrap_content"
+            android:layout_marginEnd="4dp"
+            android:text="@string/order_discount"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="@id/tv_order_all_cost"
+            app:layout_constraintEnd_toStartOf="@id/tv_order_all_cost"
+            app:layout_constraintTop_toTopOf="@id/tv_order_all_cost"
+            tools:visibility="visible" />
+
         <androidx.appcompat.widget.AppCompatTextView
             android:id="@+id/tv_order_all_cost"
             android:layout_width="wrap_content"

+ 0 - 1
module/order/src/main/res/values-in/strings.xml

@@ -21,7 +21,6 @@
     <string name="order_remark_hint">Isi permintaan, maksimal %s karakter</string>
     <string name="order_price">Harga</string>
     <string name="order_quantity">Jumlah</string>
-    <string name="order_discount">Diskon</string>
     <string name="order_total_price">Total</string>
     <string name="order_pay_now">Bayar Sekarang</string>
     <string name="order_refund_title">Ajukan pengembalian dana</string>

+ 0 - 1
module/order/src/main/res/values-zh/strings.xml

@@ -21,7 +21,6 @@
     <string name="order_remark_hint">填写要求,最多%s个字</string>
     <string name="order_price">价格</string>
     <string name="order_quantity">数量</string>
-    <string name="order_discount">折扣</string>
     <string name="order_total_price">总共</string>
     <string name="order_pay_now">支付</string>
     <string name="order_refund_title">申请退款</string>

+ 0 - 1
module/order/src/main/res/values/strings.xml

@@ -21,7 +21,6 @@
     <string name="order_remark_hint">Filling requirements, maximum %s characters</string>
     <string name="order_price">Price</string>
     <string name="order_quantity">Quantity</string>
-    <string name="order_discount">Discount</string>
     <string name="order_total_price">Total</string>
     <string name="order_pay_now">Pay Now</string>
     <string name="order_refund_title">Request refund</string>

+ 0 - 3
module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateListData.kt

@@ -107,9 +107,6 @@ data class PlaymateListData(
     @SerializedName("orderCount") val commentCount: Int, //评价数
     @SerializedName("online") val online: Boolean, //是否在线
     @SerializedName("distance") val distance: Float, //距离(单位:km)
-
-    // TODO: zhangfei
-    @SerializedName("discountPrice") val discountPrice: Float = 1f, //折扣价
 )
 
 data class PlaymateListItemData(