设备联调优化,增加已采集物品弹窗

This commit is contained in:
2025-11-07 11:35:25 +08:00
parent 73ba4431e7
commit f32990cc5d
15 changed files with 205 additions and 147 deletions
+6 -3
View File
@@ -50,9 +50,12 @@
</intent-filter>
</activity>
<activity android:name="com.sw.inbound.activity.ReceiptActivity"
android:screenOrientation="landscape"/>
<activity android:name="com.sw.inbound.activity.SelfProcurementActivity" />
<activity android:name="com.sw.inbound.activity.FoodCollectionActivity" />
android:screenOrientation="landscape"
android:windowSoftInputMode="adjustPan" />
<activity android:name="com.sw.inbound.activity.SelfProcurementActivity"
android:windowSoftInputMode="adjustPan" />
<activity android:name="com.sw.inbound.activity.FoodCollectionActivity"
android:windowSoftInputMode="adjustPan" />
<!-- <activity-->
<!-- android:name=".InitActivity"-->
@@ -17,6 +17,7 @@ import com.sw.inbound.adapter.GoodsSearchAdapter
import com.sw.inbound.databinding.ActivityFoodCollectionBinding
import com.sw.inbound.databinding.LayoutCameraPreviewBinding
import com.sw.inbound.databinding.LayoutEmptySearchBinding
import com.sw.inbound.dialog.CollectSearchDialog
import com.sw.inbound.dialog.Loading
import com.sw.inbound.model.response.SearchGoodsInfo
import com.sw.inbound.objbox.Food
@@ -152,6 +153,9 @@ class FoodCollectionActivity : ComponentActivity() {
binding.btnTakePhoto.clickWithDebounce {
takePhoto()
}
binding.btnCollectedGoods.setOnClickListener {
CollectSearchDialog(this@FoodCollectionActivity).show()
}
// binding.btnAddDefault.clickWithDebounce {
// Thread{
// FoodModule.initDefFoodData(this) {
@@ -212,6 +216,8 @@ class FoodCollectionActivity : ComponentActivity() {
// }
// }
// binding.radioGroup.check(R.id.rbCollected)
loadEmptyView()
}
@SuppressLint("NotifyDataSetChanged")
@@ -22,7 +22,7 @@ import com.sw.inbound.dialog.DialogManager
import com.sw.inbound.dialog.DropdownPopup
import com.sw.inbound.dialog.GoodsRecognizeDialog
import com.sw.inbound.dialog.GoodsSearchDialog
import com.sw.inbound.dialog.NotReceiptWarnDialog
import com.sw.inbound.dialog.WarnDialog
import com.sw.inbound.model.request.GoodsAddParam
import com.sw.inbound.model.request.PurchaseWarehouseParam
import com.sw.inbound.model.request.UploadInfo
@@ -169,13 +169,14 @@ abstract class GoodsListActivity : ComponentActivity() {
DialogManager.contains("GoodsRecognizeDialog") &&
goodsRecognizeDialog?.isShowing == true) {
goodsRecognizeDialog?.dismiss()
isShowRecognizeDialog = true
goodsRecognizeDialog = null
}
}
return
}
this.lastWeight = weight
if (DialogManager.hasShowDialog()) {
return
}
val checkResult = isFirstRecognize.not() && System.currentTimeMillis() - startTime <= DELAY_TIME
Timber.tag(TAG).d("recognizeWeight,checkResult=$checkResult")
if (checkResult) {
@@ -202,8 +203,13 @@ abstract class GoodsListActivity : ComponentActivity() {
Timber.tag(TAG).d("recognizeFood,takePhoto")
isShowRecognizeDialog = false
//bindCamera()
cameraUtils.takePhoto(takePhotoSuccessCallback)
isFirstRecognize = false
try {
cameraUtils.takePhoto(takePhotoSuccessCallback)
isFirstRecognize = false
} catch (e: Exception) {
Timber.tag(TAG).d("recognizeFood,takePhoto异常:${e.message}")
e.printStackTrace()
}
}
private var dropdownPopup: DropdownPopup? = null
@@ -265,7 +271,7 @@ abstract class GoodsListActivity : ComponentActivity() {
) {
runOnUiThread {
if (goodsRecognizeDialog?.isShowing == true) {
isShowRecognizeDialog = false
//isShowRecognizeDialog = false
return@runOnUiThread
}
goodsRecognizeDialog = GoodsRecognizeDialog(
@@ -276,12 +282,8 @@ abstract class GoodsListActivity : ComponentActivity() {
) {
GoodsSearchDialog(this).show()
}.apply {
setOnDismissListener {
goodsRecognizeDialog = null
isShowRecognizeDialog = true
}
if (isFinishing.not() && isDestroyed.not()) {
isShowRecognizeDialog = false
//isShowRecognizeDialog = false
show()
}
}
@@ -415,7 +417,7 @@ abstract class GoodsListActivity : ComponentActivity() {
val count = goodsList.count { it.isLocalGoods }
// 处理返回事件
if (count > 0) {
NotReceiptWarnDialog(context = this@GoodsListActivity) {
WarnDialog(context = this@GoodsListActivity, content = "存在未收货的物品,请确认是否放弃收货,若放弃则数据不会保存?") {
//onBackPressedDispatcher.onBackPressed()
finish()
}.show()
@@ -4,6 +4,7 @@ import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import com.sw.inbound.R
import com.sw.inbound.adapter.SelfProcurementAdapter
import com.sw.inbound.dialog.WarnDialog
import com.sw.inbound.model.request.PurchaseWarehouseParam
import com.sw.inbound.model.response.DictType
import com.sw.inbound.utils.ext.toJsonString
@@ -22,11 +23,18 @@ class SelfProcurementActivity : GoodsListActivity() {
notifyItemChanged(position)
}
addOnItemChildClickListener(R.id.ivState) { adapter, view, position ->
removeAt(position)
///删除行数据弹窗
showWarnDialog(content = "请确认是否删除该条入库数据,删除后将无法恢复?") {
removeAt(position)
}
}
}
}
private fun showWarnDialog(content:String, callback:()-> Unit) {
WarnDialog(context = this, content = content, confirmBlock = callback).show()
}
override fun initRecyclerView() {
binding.rvGoodsList.let {
it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
@@ -26,30 +26,30 @@ class CollectSearchAdapter(var list: MutableList<SearchGoodsInfo.Record>) :
holder.binding.let {
it.tvGoodsName.run {
text = item!!.goodsName
// setTextColor(if (item!!.isSelected) "#FF0032C8".toColorInt() else "#FF666666".toColorInt())
setTextColor("#FF666666".toColorInt())
setTextColor(if (item!!.isSelected) "#FF0032C8".toColorInt() else "#FF666666".toColorInt())
//setTextColor("#FF666666".toColorInt())
}
it.root.run {
if (item!!.isSelected) {
setShapeDrawable(
solidColor = "#FFEAF0FF",
strokeColor = "#FF0033CC",
strokeWidth = 2.dp,
radius = 10.dp
)
} else {
setShapeDrawable(
solidColor = "#FFF5F5F5",
radius = 10.dp
)
}
}
// it.root.run {
// if (item!!.isSelected) {
// setShapeDrawable(
// solidColor = "#FFEAF0FF",
// strokeColor = "#FF0033CC",
// strokeWidth = 2.dp,
// radius = 10.dp
// )
// } else {
// setShapeDrawable(
// solidColor = "#FFF5F5F5",
// radius = 10.dp
// )
// }
// setShapeDrawable(
// solidColor = "#FFF5F5F5",
// radius = 10.dp
// )
// }
it.root.run {
setShapeDrawable(
solidColor = "#FFF5F5F5",
radius = 10.dp
)
}
}
}
@@ -8,6 +8,7 @@ import android.os.Bundle
import android.view.Gravity
import android.view.View
import com.sw.inbound.R
import com.sw.inbound.activity.FoodCollectionActivity
import com.sw.inbound.activity.GoodsListActivity
import com.sw.inbound.utils.ext.dp
import com.sw.inbound.utils.ext.hideKeyboard
@@ -15,7 +16,7 @@ import com.sw.inbound.utils.ext.hideKeyboard
abstract class BaseDialog(
context: Context,
var defWidth: Int = 1500.dp,
var defHeight: Int = 900.dp
var defHeight: Int = 800.dp
) : Dialog(context, R.style.DialogTheme) {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -48,6 +49,17 @@ abstract class BaseDialog(
return null
}
fun getFoodCollectionActivity(): FoodCollectionActivity? {
var ctx = context
while (ctx is ContextWrapper) {
ctx = ctx.baseContext
if (ctx is FoodCollectionActivity) {
return ctx
}
}
return null
}
override fun show() {
super.show()
DialogManager.addDialog(this)
@@ -4,10 +4,11 @@ import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.sw.inbound.R
import com.sw.inbound.activity.GoodsListActivity
import com.sw.inbound.activity.FoodCollectionActivity
import com.sw.inbound.adapter.CollectSearchAdapter
import com.sw.inbound.databinding.DialogCollectSearchBinding
import com.sw.inbound.databinding.LayoutEmptySearchBinding
@@ -34,14 +35,31 @@ class CollectSearchDialog(
return binding.root
}
private var activity: GoodsListActivity? = null
private var activity: FoodCollectionActivity? = null
override fun initView() {
activity = getReceiptActivity()
activity = getFoodCollectionActivity()
binding.ivClose.setOnClickListener { dismiss() }
binding.ivGoodsSearch.setOnClickListener { searchGoods() }
binding.ivGoodsSearch.setOnClickListener {
val searchName = binding.etInputGoods.text.toString().trim()
if (searchName.isBlank()) {
activity?.toast("请输入物品名称")
return@setOnClickListener
}
getCollectGoods(searchName)
}
binding.etInputGoods.let { v ->
v.addOnActionSearchListener {
searchGoods()
val searchName = binding.etInputGoods.text.toString().trim()
if (searchName.isBlank()) {
activity?.toast("请输入物品名称")
return@addOnActionSearchListener
}
getCollectGoods(searchName)
}
v.addTextChangedListener {
if (it.isNullOrBlank()) {
getCollectGoods()
}
}
}
binding.btnConfirm.setOnClickListener {
@@ -56,55 +74,28 @@ class CollectSearchDialog(
it.setEnableLoadMore(false)
it.setOnRefreshListener {
pageNo = 1
searchGoods()
}
it.setOnLoadMoreListener {
searchGoods()
val searchName = binding.etInputGoods.text.toString().trim()
getCollectGoods(searchName)
}
//it.setOnLoadMoreListener {
// searchGoods()
//}
}
getCollectGoods()
//binding.root.clickWithDebounce {
// Thread {
// FoodModule.initDefFoodData(activity!!) {
// activity?.runOnUiThread {
// activity?.toast("添加完成")
// getCollectGoods()
// }
// }
// }.start()
//}
}
private var pageNo = 1
companion object {
private const val PAGE_SIZE = 10
}
@SuppressLint("NotifyDataSetChanged")
private fun searchGoods() {
val searchName = binding.etInputGoods.text.toString().trim()
if (searchName.isBlank()) {
activity?.toast("请输入物品名称")
finishRefresh()
return
}
activity?.searchGoods(
searchName = searchName,
pageNo = pageNo,
pageSize = PAGE_SIZE
) { records ->
finishRefresh()
binding.etInputGoods.hideKeyboard()
if (pageNo == 1) {
list.clear()
}
list.addAll(records)
if (list.isEmpty()) {
loadEmptyView()
return@searchGoods
}
val enableLoadMore = records.size >= PAGE_SIZE
binding.refreshLayout.setEnableLoadMore(enableLoadMore)
if (enableLoadMore) {
pageNo++
}
binding.rvSearch.layoutManager =
GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false)
searchAdapter.notifyDataSetChanged()
}
}
private fun loadEmptyView() {
binding.rvSearch.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
@@ -140,9 +131,9 @@ class CollectSearchDialog(
}
}
private fun deleteGoods(position:Int) {
WarnDialog(context = context, content = "请确认是否删除物品?", confirmBlock = {
Thread{
private fun deleteGoods(position: Int) {
WarnDialog(context = context, content = "请确认是否删除物品${list[position].goodsName}", confirmBlock = {
Thread {
activity?.runOnUiThread {
Loading.show(context)
}
@@ -151,9 +142,13 @@ class CollectSearchDialog(
box?.removeByIds(filterIdList)
activity?.runOnUiThread {
Loading.dismiss()
list.removeAt(position)
searchAdapter.notifyDataSetChanged()
//list.remove(list[position])
//searchAdapter.notifyDataSetChanged()
searchAdapter.removeAt(position)
activity?.toast("删除成功")
if (list.isEmpty()) {
loadEmptyView()
}
}
}.start()
}).show()
@@ -170,19 +165,28 @@ class CollectSearchDialog(
}
private var box: Box<Food>? = null
@SuppressLint("NotifyDataSetChanged")
private fun getCollectGoods() {
private fun getCollectGoods(searchName:String?=null) {
if (box == null) {
box = ObjectBox.boxStore.boxFor(Food::class)
}
box?.all?.distinctBy { it.name }?.forEach {
list.clear()
var queryList = box?.all?.distinctBy { it.name }
if (searchName.isNullOrBlank().not()) {
queryList = queryList?.filter { it.name?.contains(searchName) == true }
}
queryList?.forEach {
list.add((SearchGoodsInfo.Record(goodsName = it.name)))
}
binding.rvSearch.layoutManager = GridLayoutManager(activity, 2, LinearLayoutManager.VERTICAL, false)
binding.rvSearch.layoutManager =
GridLayoutManager(activity, 2, LinearLayoutManager.VERTICAL, false)
searchAdapter.notifyDataSetChanged()
if (list.isEmpty()) {
loadEmptyView()
}
finishRefresh()
binding.root.hideKeyboard()
}
}
@@ -2,7 +2,7 @@ package com.sw.inbound.dialog
object DialogManager {
private var dialogList:MutableList<BaseDialog> = mutableListOf()
private var dialogList: MutableList<BaseDialog> = mutableListOf()
fun addDialog(dialog: BaseDialog) {
if (dialogList.contains(dialog).not()) {
@@ -17,7 +17,7 @@ object DialogManager {
dialogList.remove(dialog)
}
fun getDialogList():MutableList<BaseDialog> {
fun getDialogList(): MutableList<BaseDialog> {
return dialogList
}
@@ -35,9 +35,14 @@ object DialogManager {
}
}
fun contains(vararg className: String):Boolean {
fun contains(vararg className: String): Boolean {
val item = dialogList.firstOrNull { className.contains(it.javaClass.simpleName) }
return item != null
}
fun hasShowDialog(): Boolean {
val item = dialogList.firstOrNull { it.isShowing }
return item != null
}
}
@@ -98,4 +98,12 @@ class GoodsRecognizeDialog(
recognizeAdapter.stateView = it
}
}
override fun dismiss() {
super.dismiss()
activity?.run {
isShowRecognizeDialog = true
goodsRecognizeDialog = null
}
}
}
@@ -1,34 +1,34 @@
package com.sw.inbound.dialog
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import com.sw.inbound.databinding.DialogNotReceiptWarnBinding
import com.sw.inbound.utils.ext.dp
class NotReceiptWarnDialog(
context: Context,
var cancelBlock: () -> Unit = {},
var confirmBlock: () -> Unit = {},
) : BaseDialog(context = context, defWidth = 960.dp, defHeight = 540.dp) {
private lateinit var binding: DialogNotReceiptWarnBinding
override fun getRootView(): View {
val inflater = LayoutInflater.from(context)
binding = DialogNotReceiptWarnBinding.inflate(inflater)
return binding.root
}
override fun initView() {
binding.btnCancel.setOnClickListener {
cancelBlock()
dismiss()
}
binding.btnConfirm.setOnClickListener {
confirmBlock()
dismiss()
}
}
}
//package com.sw.inbound.dialog
//
//import android.content.Context
//import android.view.LayoutInflater
//import android.view.View
//import com.sw.inbound.databinding.DialogNotReceiptWarnBinding
//import com.sw.inbound.utils.ext.dp
//
//class NotReceiptWarnDialog(
// context: Context,
// var cancelBlock: () -> Unit = {},
// var confirmBlock: () -> Unit = {},
//) : BaseDialog(context = context, defWidth = 960.dp, defHeight = 540.dp) {
//
// private lateinit var binding: DialogNotReceiptWarnBinding
// override fun getRootView(): View {
// val inflater = LayoutInflater.from(context)
// binding = DialogNotReceiptWarnBinding.inflate(inflater)
// return binding.root
// }
//
// override fun initView() {
// binding.btnCancel.setOnClickListener {
// cancelBlock()
// dismiss()
// }
// binding.btnConfirm.setOnClickListener {
// confirmBlock()
// dismiss()
// }
// }
//
//
//}
@@ -12,7 +12,7 @@ class WarnDialog(
var content:String,
var cancelBlock: () -> Unit = {},
var confirmBlock: () -> Unit = {},
) : BaseDialog(context = context, defWidth = 960.dp, defHeight = 540.dp) {
) : BaseDialog(context = context, defWidth = 660.dp, defHeight = 360.dp) {
private lateinit var binding: DialogWarnBinding
override fun getRootView(): View {
@@ -77,7 +77,7 @@ class PhotoCaptureHelper(
if (errorMsg.contains("Not bound to a valid Camera")) {
if (bindCamera != null) {
bindCamera?.invoke()
takePhoto()
//takePhoto()
}
}
@@ -50,6 +50,16 @@
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:id="@+id/btnCollectedGoods"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingHorizontal="20dp"
android:text="查看已采集物品"
android:textColor="#ff333333"
android:textSize="24sp" />
<!-- <TextView-->
<!-- android:id="@+id/btnAddDefault"-->
<!-- android:layout_width="wrap_content"-->
+12 -13
View File
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="960dp"
android:layout_height="540dp"
android:layout_width="660dp"
android:layout_height="360dp"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_white_radius12"
tools:ignore="HardcodedText">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_tip_warn"
tools:ignore="ContentDescription" />
@@ -18,42 +18,41 @@
android:id="@+id/tvWarnContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="80dp"
android:layout_marginHorizontal="40dp"
android:layout_marginVertical="50dp"
android:gravity="center"
tools:text="存在未收货的物品,请确认是否放弃收货,若放弃则数据不会保存?"
android:textColor="#ff141428"
android:textSize="36sp"
android:textSize="32sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<Button
android:id="@+id/btnCancel"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="240dp"
android:layout_height="80dp"
android:layout_width="180dp"
android:layout_height="60dp"
android:background="@drawable/bg_white_stroke_blue_ripple"
android:text="取消"
android:textColor="#FF0033CC"
android:textSize="30sp"
android:textSize="26sp"
android:textStyle="bold" />
<Button
android:id="@+id/btnConfirm"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="240dp"
android:layout_height="80dp"
android:layout_width="180dp"
android:layout_height="60dp"
android:layout_marginStart="50dp"
android:background="@drawable/bg_blue_ripple"
android:text="确认"
android:textColor="@color/white"
android:textSize="30sp"
android:textSize="26sp"
android:textStyle="bold" />
</LinearLayout>
@@ -136,8 +136,9 @@
<ImageView
android:id="@+id/ivState"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="25dp"
android:layout_gravity="center"
android:gravity="center"
android:src="@mipmap/ic_close"