SearchOrderActivity.kt 11.5 KB
Newer Older
1 2 3
package com.miya.fastcashier.ui

import android.content.Context
4
import android.content.Intent
gaodapeng's avatar
gaodapeng committed
5
import android.graphics.Rect
6 7 8 9
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
gaodapeng's avatar
gaodapeng committed
10
import android.widget.Toast
gaodapeng's avatar
gaodapeng committed
11
import androidx.core.content.res.ResourcesCompat
12
import androidx.fragment.app.Fragment
gaodapeng's avatar
gaodapeng committed
13
import androidx.lifecycle.ViewModelProvider
14 15 16
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.adapter.FragmentStateAdapter
17
import com.elvishew.xlog.XLog
赵鹏翔's avatar
赵鹏翔 committed
18
import com.fastcashier.lib_common.base.BaseActivity
19
import com.fastcashier.lib_common.function.account.AccountService
20 21 22
import com.fastcashier.lib_common.function.pay.MiYaPayPlantformPayWayEnum
import com.fastcashier.lib_common.function.print.PrintService
import com.fastcashier.lib_common.util.StringPriceFormatUtils
23
import com.fastcashier.lib_common.util.clickWithTrigger
24
import com.fastcashier.lib_common.util.dp2px
25 26
import com.google.android.material.tabs.TabLayoutMediator
import com.miya.fastcashier.R
gaodapeng's avatar
gaodapeng committed
27
import com.miya.fastcashier.dao.PayDataDao
28
import com.miya.fastcashier.dao.ViewPayOrderData
29 30 31
import com.miya.fastcashier.databinding.ActivitySearchOrderBinding
import com.miya.fastcashier.databinding.FragmentSearchOrderBinding
import com.miya.fastcashier.databinding.ItemSearchOrderListBinding
32
import com.miya.fastcashier.utils.CenterToasty
33
import com.miya.fastcashier.utils.manage.LocalKeyDataMKManageKit
gaodapeng's avatar
gaodapeng committed
34
import com.miya.fastcashier.viewmodel.SearchOrderViewModel
35 36 37 38 39 40 41

/**
 * 查单列表
 */
class SearchOrderActivity : BaseActivity() {
    private lateinit var binding: ActivitySearchOrderBinding

42 43 44 45 46 47 48
    companion object {
        fun start(context: BaseActivity) {
            val intent = Intent(context, SearchOrderActivity::class.java)
            context.startActivity(intent)
        }
    }

49 50 51 52
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySearchOrderBinding.inflate(LayoutInflater.from(this))
        setContentView(binding.root)
gaodapeng's avatar
gaodapeng committed
53
        binding.title.llBack.clickWithTrigger { finish() }
54 55 56 57 58 59 60 61 62 63 64 65 66

        binding.vpPage.adapter = object : FragmentStateAdapter(this) {
            override fun getItemCount(): Int {
                return 2
            }

            override fun createFragment(position: Int): Fragment {
                return when (position) {
                    0 -> SearchOrderFragment(MiYaPayPlantformPayWayEnum.MiyaPayType.WEIXIN)
                    else -> SearchOrderFragment(MiYaPayPlantformPayWayEnum.MiyaPayType.ALIPAY)
                }
            }
        }
67 68 69 70 71 72 73 74 75 76 77

        TabLayoutMediator(
            binding.tlIndicator,
            binding.vpPage
        ) { tab, position ->
            when (position) {
                0 -> tab.text = "微信"
                1 -> tab.text = "支付宝"
                else -> tab.text = ""
            }
        }.attach()
78 79 80 81
    }
}


gaodapeng's avatar
gaodapeng committed
82
class SearchOrderFragment(val payType: MiYaPayPlantformPayWayEnum.MiyaPayType) : Fragment() {
83 84 85
    private var binding: FragmentSearchOrderBinding? = null

    private lateinit var adapter: SearchOrderListAdapter
gaodapeng's avatar
gaodapeng committed
86
    private lateinit var vm: SearchOrderViewModel
87 88

    //    private var onLoading = false
gaodapeng's avatar
gaodapeng committed
89
    private var isEnd = false
90 91
    private var balanceDate = 0L

92 93 94 95 96 97 98 99 100 101 102 103 104 105
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentSearchOrderBinding.inflate(inflater, container, false)
        return binding!!.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (activity == null) {
            return
        }
gaodapeng's avatar
gaodapeng committed
106
        isEnd = false
107
//        onLoading = false
108
        balanceDate = LocalKeyDataMKManageKit.getBalanceDate()
109 110 111 112 113
        val act = requireActivity()
        binding?.run {
            adapter = SearchOrderListAdapter(act, arrayListOf())
            rvContent.layoutManager = LinearLayoutManager(act, LinearLayoutManager.VERTICAL, false)
            rvContent.adapter = adapter
gaodapeng's avatar
gaodapeng committed
114 115 116 117 118 119 120 121 122 123 124 125 126
            rvContent.addItemDecoration(
                object : RecyclerView.ItemDecoration() {
                    val itemMargin = dp2px(act, 16F)
                    override fun getItemOffsets(
                        outRect: Rect,
                        view: View,
                        parent: RecyclerView,
                        state: RecyclerView.State
                    ) {
                        outRect.set(itemMargin, itemMargin, itemMargin, 0)
                    }
                }
            )
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
//            rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
//                //用来标记是否正在向最后一个滑动
//                var isSlidingToLast = false
//
//                override fun onScrollStateChanged(
//                    recyclerView: RecyclerView,
//                    newState: Int
//                ) {
//                    if (isEnd) { //如果已经加载完成,就不处理
//                        return
//                    }
//                    val manager = recyclerView.layoutManager as LinearLayoutManager?
//                    // 当不滚动时
//                    if (manager != null && newState == RecyclerView.SCROLL_STATE_IDLE) {
//                        //获取最后一个完全显示的ItemPosition
//                        val lastVisibleItem = manager.findLastCompletelyVisibleItemPosition()
//                        val totalItemCount = manager.itemCount
//
//                        // 判断是否滚动到底部,并且是向右滚动
//                        if (!onLoading && totalItemCount > 5 && lastVisibleItem > totalItemCount - 5 && isSlidingToLast) { //滑到最后5条的时候,如果不是列表已经结束,那么就
//                            //加载更多功能的代码
//                            onLoading = true
//                            loadMore(adapter.itemCount)
//                        }
//                    }
//                }
//
//                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
//                    //dx用来判断横向滑动方向,dy用来判断纵向滑动方向
//                    isSlidingToLast = dy > 0
//                }
//            })
159
        }
gaodapeng's avatar
gaodapeng committed
160 161 162

        vm = ViewModelProvider(this).get(SearchOrderViewModel::class.java)
        vm.payDataLiveData.observe(act) {
163
//            onLoading = false
gaodapeng's avatar
gaodapeng committed
164 165 166 167 168
            it.onFailure { e ->
                CenterToasty.error(act, e.message ?: "", Toast.LENGTH_LONG).show()
            }
            it.onSuccess { list ->
                val oldSize = adapter.getDataSource().size
zhaopengxiang's avatar
zhaopengxiang committed
169 170 171 172 173 174

                if (oldSize == 0 && list.size == 0)
                    binding!!.cpEmptyView.visibility = View.VISIBLE
                else
                    binding!!.cpEmptyView.visibility = View.GONE

gaodapeng's avatar
gaodapeng committed
175 176 177 178 179 180 181 182 183 184 185
                adapter.getDataSource().addAll(list)
                if (oldSize == 0) {
                    adapter.notifyDataSetChanged()
                } else {
                    adapter.notifyItemInserted(oldSize)
                }
                if (list.size < PayDataDao.NUM_OF_SINGLE_PAGE) {//如果不足20条,表示已经到底,不用查了
                    isEnd = true
                }
            }
        }
zhaopengxiang's avatar
zhaopengxiang committed
186
        initEmptyView()
gaodapeng's avatar
gaodapeng committed
187 188 189
        loadMore(0)
    }

zhaopengxiang's avatar
zhaopengxiang committed
190 191 192 193 194 195
    private fun initEmptyView() {
        binding!!.cpEmptyView.visibility = View.GONE
        binding!!.cpEmptyView.setPromptText(getString(R.string.search_order_prompt_text))
        binding!!.cpEmptyView.setPromptImage(R.mipmap.app_bg_common_empty)
    }

gaodapeng's avatar
gaodapeng committed
196 197
    private fun loadMore(loadIndex: Int) {
        //加载更多
198
//        vm.getPayData(payType, loadIndex)
199
        vm.getPayDataByTimeAndUser(payType, AccountService.getUserName(), balanceDate)
200
//        onLoading = true
201 202 203 204 205 206 207 208
    }

    override fun onDestroyView() {
        binding = null
        super.onDestroyView()
    }
}

209 210 211 212
class SearchOrderListAdapter(
    val context: Context,
    private val list: MutableList<ViewPayOrderData>
) :
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
    RecyclerView.Adapter<SearchOrderViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchOrderViewHolder {
        return SearchOrderViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.item_search_order_list, parent, false)
        )
    }

    override fun onBindViewHolder(holder: SearchOrderViewHolder, position: Int) {
        holder.setData(list[position])
    }

    override fun getItemCount(): Int {
        return list.size
    }

gaodapeng's avatar
gaodapeng committed
229 230 231 232
    fun getDataSource(): MutableList<ViewPayOrderData> {
        return list
    }

233 234 235 236 237
}

class SearchOrderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    private val binding: ItemSearchOrderListBinding = ItemSearchOrderListBinding.bind(itemView)

238
    fun setData(data: ViewPayOrderData) {
gaodapeng's avatar
gaodapeng committed
239

240
        binding.tvDate.text = data.chanelOrderTradeTime
gaodapeng's avatar
gaodapeng committed
241
        binding.tvDateTitle.text = "下单时间"
gaodapeng's avatar
gaodapeng committed
242 243
        if (data.refundOrderNo != null && data.refundPrice != null) {
            binding.tvPrice.text =
244
                "¥" + StringPriceFormatUtils.transStringPriceToDecimalString(data.refundPrice)
gaodapeng's avatar
gaodapeng committed
245
            binding.tvOrderNo.text = data.refundOrderNo
gaodapeng's avatar
gaodapeng committed
246 247 248 249 250 251 252 253 254 255
            binding.tvSerialNo.text = data.tradeNo
            binding.tvOrderNoTitle.text = "退款订单号"
            binding.tvSerialNoTitle.text = "退款流水号"
            binding.tvPriceTitle.text = "退款金额"
            binding.tvPrice.setTextColor(
                ResourcesCompat.getColor(
                    itemView.resources,
                    R.color.color_FF4E33, null
                )
            )
gaodapeng's avatar
gaodapeng committed
256 257
        } else {
            binding.tvPrice.text =
258
                "¥" + StringPriceFormatUtils.transStringPriceToDecimalString(data.tradPrice)
gaodapeng's avatar
gaodapeng committed
259
            binding.tvOrderNo.text = data.orderNo
gaodapeng's avatar
gaodapeng committed
260 261 262 263 264 265 266 267 268 269
            binding.tvOrderNoTitle.text = "订单号"
            binding.tvSerialNoTitle.text = "流水号"
            binding.tvPriceTitle.text = "订单金额"
            binding.tvSerialNo.text = data.tradeNo
            binding.tvPrice.setTextColor(
                ResourcesCompat.getColor(
                    itemView.resources,
                    R.color.color_333333, null
                )
            )
gaodapeng's avatar
gaodapeng committed
270
        }
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

        binding.vBg.setOnLongClickListener {
            binding.groupPrinter.visibility = View.VISIBLE
            true
        }

        binding.tvPrinter.setOnClickListener(object : View.OnClickListener {
            override fun onClick(p0: View?) {
                binding.groupPrinter.visibility = View.GONE
                printer(data)
            }
        })

        binding.vPrinter.setOnClickListener(object : View.OnClickListener {
            override fun onClick(p0: View?) {
                binding.groupPrinter.visibility = View.GONE
            }
        })
    }

    fun printer(data: ViewPayOrderData) {
        var isRefund: Boolean = data.refundOrderNo != null && data.refundPrice != null
        //退款打印
        try {
            XLog.d("开始打印")
            AccountService.getAccountInfo()
                ?.let {
                    ViewPayOrderData.transformPayServiceResponse(data)?.let { it1 ->
                        PrintService.printSearchOrder(
                            it,
                            it1,
                            isRefund
                        )
                    }
                }
        } catch (e: Exception) {
            e.printStackTrace()
            XLog.d("打印异常${e.message}")
        }
310 311 312
    }

}