提交入库参数、采集数据优化

This commit is contained in:
2026-01-30 15:07:56 +08:00
parent a7bac4321e
commit efcf3d436b
9 changed files with 80 additions and 65 deletions
@@ -249,6 +249,7 @@ class FoodCollectionActivity : ComponentActivity() {
toast("每次只允许保存${MAX_COUNT}条数据") toast("每次只允许保存${MAX_COUNT}条数据")
return return
} }
showWaitingDialog2("加载中")
cameraUtils.takePhoto(cameraCallback) cameraUtils.takePhoto(cameraCallback)
} }
@@ -287,6 +288,7 @@ class FoodCollectionActivity : ComponentActivity() {
val index = collectList.indexOfFirst { it.imageFile == null } val index = collectList.indexOfFirst { it.imageFile == null }
if (index == -1) { if (index == -1) {
toast("每次只允许保存${MAX_COUNT}条数据") toast("每次只允许保存${MAX_COUNT}条数据")
showWaitingDialog2("加载中")
rerurn@ cameraCallback rerurn@ cameraCallback
} }
// toast("index=$index") // toast("index=$index")
@@ -302,6 +304,7 @@ class FoodCollectionActivity : ComponentActivity() {
FoodModule.bitmap2FloatArray(cropBitmap, false) FoodModule.bitmap2FloatArray(cropBitmap, false)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
hideWaitingDialog()
toast("操作失败") toast("操作失败")
return@let return@let
} }
@@ -309,6 +312,7 @@ class FoodCollectionActivity : ComponentActivity() {
val filterList = val filterList =
foodList.filter { it.score < FoodModule.BAG_RATE && it.name.contains("黑袋子") } foodList.filter { it.score < FoodModule.BAG_RATE && it.name.contains("黑袋子") }
if (filterList.isNotEmpty()) { if (filterList.isNotEmpty()) {
hideWaitingDialog()
toast("当前物品可能被袋子遮挡,请检查后重试") toast("当前物品可能被袋子遮挡,请检查后重试")
return@let return@let
} }
@@ -333,9 +337,11 @@ class FoodCollectionActivity : ComponentActivity() {
if (bitmap.isRecycled.not()) { if (bitmap.isRecycled.not()) {
bitmap.recycle() bitmap.recycle()
} }
hideWaitingDialog()
} }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
hideWaitingDialog()
toast("程序异常${e.message}") toast("程序异常${e.message}")
} }
} }
@@ -549,35 +555,40 @@ class FoodCollectionActivity : ComponentActivity() {
/** /**
* 显示等待提示框 * 显示等待提示框
*/ */
fun showWaitingDialog(tip: String?): Dialog? { fun showWaitingDialog(tip: String?) {
hideWaitingDialog() runOnUiThread {
val view = View.inflate(this, R.layout.dialog_waiting, null) hideWaitingDialog()
if (!TextUtils.isEmpty(tip)) (view.findViewById<View?>(R.id.tvTip) as TextView).text = tip val view = View.inflate(this, R.layout.dialog_waiting, null)
mDialogWaiting = CustomDialog(this, view, R.style.MyDialog) if (!TextUtils.isEmpty(tip)) (view.findViewById<View?>(R.id.tvTip) as TextView).text = tip
mDialogWaiting!!.show() mDialogWaiting = CustomDialog(this, view, R.style.MyDialog)
mDialogWaiting!!.setCancelable(true) mDialogWaiting!!.show()
return mDialogWaiting mDialogWaiting!!.setCancelable(true)
}
} }
/** /**
* 隐藏等待提示框 * 隐藏等待提示框
*/ */
fun hideWaitingDialog() { fun hideWaitingDialog() {
mDialogWaiting?.dismiss() runOnUiThread {
mDialogWaiting = null mDialogWaiting?.dismiss()
mDialogWaiting = null
}
} }
fun showWaitingDialog2(tip: String?) { fun showWaitingDialog2(tip: String?) {
if (mDialogWaiting == null) { runOnUiThread {
hideWaitingDialog() if (mDialogWaiting == null) {
val view = View.inflate(this, R.layout.dialog_waiting, null) hideWaitingDialog()
mDialogWaiting = CustomDialog(this, view, R.style.MyDialog) val view = View.inflate(this, R.layout.dialog_waiting, null)
mDialogWaiting!!.show() mDialogWaiting = CustomDialog(this, view, R.style.MyDialog)
mDialogWaiting!!.setCancelable(true) mDialogWaiting!!.show()
mDialogWaiting!!.setCancelable(true)
}
val contentView = mDialogWaiting?.findViewById<ViewGroup>(android.R.id.content)
val tvTip = contentView?.findViewById<TextView>(R.id.tvTip)
tvTip?.text = tip
} }
val contentView = mDialogWaiting?.findViewById<ViewGroup>(android.R.id.content)
val tvTip = contentView?.findViewById<TextView>(R.id.tvTip)
tvTip?.text = tip
} }
/** /**
@@ -45,6 +45,7 @@ import com.sw.inbound.utils.ext.roundedDecimalPlace
import com.sw.inbound.utils.ext.toJsonString import com.sw.inbound.utils.ext.toJsonString
import com.sw.inbound.utils.ext.toast import com.sw.inbound.utils.ext.toast
import com.sw.inbound.viewmodel.ReceiptViewModel import com.sw.inbound.viewmodel.ReceiptViewModel
import com.sw.inbound.viewmodel.UserViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@@ -77,7 +78,8 @@ abstract class GoodsListActivity : ComponentActivity() {
var id: String = "" var id: String = ""
var supplierId: String = "" var supplierId: String = ""
lateinit var binding: ActivityGoodsListBinding lateinit var binding: ActivityGoodsListBinding
val viewModel: ReceiptViewModel by viewModels() val receiptViewModel: ReceiptViewModel by viewModels()
val userViewModel: UserViewModel by viewModels()
val goodsList: MutableList<GoodsInfo> = mutableListOf() val goodsList: MutableList<GoodsInfo> = mutableListOf()
abstract fun initRecyclerView() abstract fun initRecyclerView()
@@ -167,6 +169,8 @@ abstract class GoodsListActivity : ComponentActivity() {
//val array = arrayOf("1","2","qwe") //val array = arrayOf("1","2","qwe")
//Timber.tag(TAG).d("测试:${array[2].toInt()}") //Timber.tag(TAG).d("测试:${array[2].toInt()}")
userViewModel.getInitInfo()
} }
private var weightCallback: ((weight: Int) -> Unit)? = null private var weightCallback: ((weight: Int) -> Unit)? = null
@@ -346,7 +350,7 @@ abstract class GoodsListActivity : ComponentActivity() {
} }
return@let return@let
} }
viewModel.recognizeGoodsList( receiptViewModel.recognizeGoodsList(
//nameList = foodList, //nameList = foodList,
scoreList = foodList, scoreList = foodList,
) { goodsList -> ) { goodsList ->
@@ -488,7 +492,7 @@ abstract class GoodsListActivity : ComponentActivity() {
pageNo: Int, pageNo: Int,
pageSize: Int = PAGE_SIZE pageSize: Int = PAGE_SIZE
): List<SearchGoodsInfo.Record> { ): List<SearchGoodsInfo.Record> {
return viewModel.searchGoodsInfoList2( return receiptViewModel.searchGoodsInfoList2(
goodsName = searchName, goodsName = searchName,
pageNo = pageNo, pageNo = pageNo,
pageSize = pageSize pageSize = pageSize
@@ -562,7 +566,7 @@ abstract class GoodsListActivity : ComponentActivity() {
) )
Timber.tag("SelfProcurementActivity") Timber.tag("SelfProcurementActivity")
.d("receiptSubmit确认收货提交数据:${uploadInfo.toJsonString()}") .d("receiptSubmit确认收货提交数据:${uploadInfo.toJsonString()}")
viewModel.confirmReceipt(uploadInfo) { success -> receiptViewModel.confirmReceipt(uploadInfo) { success ->
if (success) { if (success) {
toast("确认收货成功") toast("确认收货成功")
finish() finish()
@@ -597,7 +601,7 @@ abstract class GoodsListActivity : ComponentActivity() {
} }
Timber.tag("SelfProcurementActivity") Timber.tag("SelfProcurementActivity")
.d("selfProcurementSubmit自采入库提交数据:${submitData.toJsonString()}") .d("selfProcurementSubmit自采入库提交数据:${submitData.toJsonString()}")
viewModel.addToWarehouse(submitData) { success -> receiptViewModel.addToWarehouse(submitData) { success ->
if (success) { if (success) {
toast("提交入库成功") toast("提交入库成功")
finish() finish()
@@ -618,13 +622,13 @@ abstract class GoodsListActivity : ComponentActivity() {
// } // }
fun createNewGoods(file: File, param: GoodsAddParam, callback: (Boolean) -> Unit) { fun createNewGoods(file: File, param: GoodsAddParam, callback: (Boolean) -> Unit) {
viewModel.uploadImage(file) { imgUrl -> receiptViewModel.uploadImage(file) { imgUrl ->
if (imgUrl.isNullOrBlank()) { if (imgUrl.isNullOrBlank()) {
toast("图片上传失败") toast("图片上传失败")
return@uploadImage return@uploadImage
} }
param.relativeUrl = imgUrl param.relativeUrl = imgUrl
viewModel.createNewGoods(param = param, callback = callback) receiptViewModel.createNewGoods(param = param, callback = callback)
} }
} }
@@ -651,7 +655,7 @@ abstract class GoodsListActivity : ComponentActivity() {
val map = hashMapOf<String, RequestBody>() val map = hashMapOf<String, RequestBody>()
map["goodsId"] = goodsId.toRequestBody() map["goodsId"] = goodsId.toRequestBody()
map["goodsName"] = goodsName.toRequestBody() map["goodsName"] = goodsName.toRequestBody()
viewModel.uploadMultipleImages(files = list, params = map) receiptViewModel.uploadMultipleImages(files = list, params = map)
} }
} }
@@ -1,16 +1,12 @@
package com.sw.inbound.activity package com.sw.inbound.activity
import android.annotation.SuppressLint import android.annotation.SuppressLint
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.sw.inbound.adapter.ReceiptGoodsAdapter import com.sw.inbound.adapter.ReceiptGoodsAdapter
import com.sw.inbound.model.response.DictType import com.sw.inbound.model.response.DictType
import com.sw.inbound.utils.ext.gone import com.sw.inbound.utils.ext.gone
import com.sw.inbound.utils.ext.toast import com.sw.inbound.utils.ext.toast
import com.sw.inbound.utils.ext.visible import com.sw.inbound.utils.ext.visible
import kotlinx.coroutines.launch
class ReceiptActivity : GoodsListActivity() { class ReceiptActivity : GoodsListActivity() {
@@ -42,7 +38,7 @@ class ReceiptActivity : GoodsListActivity() {
} }
} }
if (isNewReceipt.not()) { if (isNewReceipt.not()) {
viewModel.getReceiveDetail(id) { detail -> receiptViewModel.getReceiveDetail(id) { detail ->
runOnUiThread { runOnUiThread {
if (detail == null) { if (detail == null) {
toast("未查询到数据") toast("未查询到数据")
@@ -1,24 +1,21 @@
package com.sw.inbound.adapter package com.sw.inbound.adapter
import android.content.Context import android.content.Context
import android.net.Uri
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import androidx.core.net.toUri import androidx.core.net.toUri
import coil.load import coil.load
import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.sw.inbound.R
import com.sw.inbound.databinding.ListItemFoodCollectionBinding import com.sw.inbound.databinding.ListItemFoodCollectionBinding
import com.sw.inbound.objbox.FoodCollectionBean import com.sw.inbound.objbox.FoodCollectionBean
import kotlin.let import com.sw.inbound.utils.ext.gone
import kotlin.run import com.sw.inbound.utils.ext.invisible
import com.sw.inbound.utils.ext.visible
class FoodCollectionAdapter (var list: MutableList<FoodCollectionBean>) : class FoodCollectionAdapter(var list: MutableList<FoodCollectionBean>) :
BaseQuickAdapter<FoodCollectionBean, FoodCollectionAdapter.VH>(list) { BaseQuickAdapter<FoodCollectionBean, FoodCollectionAdapter.VH>(list) {
inner class VH(var binding: ListItemFoodCollectionBinding) : QuickViewHolder(binding.root) inner class VH(var binding: ListItemFoodCollectionBinding) : QuickViewHolder(binding.root)
@@ -32,24 +29,24 @@ class FoodCollectionAdapter (var list: MutableList<FoodCollectionBean>) :
override fun onBindViewHolder(holder: VH, position: Int, item: FoodCollectionBean?) { override fun onBindViewHolder(holder: VH, position: Int, item: FoodCollectionBean?) {
val binding = holder.binding val binding = holder.binding
item?.let { item?.let {
binding.ivFinish.visibility = if (it.isFinish) View.VISIBLE else View.GONE binding.ivFinish.run {
binding.ivDelete.visibility = if (it.isShowCamera) View.GONE else View.VISIBLE if (it.isFinish) visible() else gone()
binding.imageView.run { }
if (it.isShowCamera) { binding.ivDelete.run {
load(null) if (it.isShowCamera) gone() else visible()
postDelayed({ }
scaleType = ImageView.ScaleType.CENTER if (it.isShowCamera) {
setImageResource(R.mipmap.ic_camera256) binding.imageView.invisible()
},100) binding.ivCameraFlag.visible()
} else { //binding.imageView.load(null)
} else {
binding.ivCameraFlag.invisible()
binding.imageView.run {
visible()
scaleType = ImageView.ScaleType.FIT_CENTER scaleType = ImageView.ScaleType.FIT_CENTER
//setImageURI(it.imageUri)
// load(it.bitmap)
// setImageBitmap(it.bitmap!!)
//setImageURI(it.imageFile?.toUri())
load(it.imageFile?.toUri()) { load(it.imageFile?.toUri()) {
crossfade(true) crossfade(true)
transformations(RoundedCornersTransformation(5f,5f,5f,5f)) transformations(RoundedCornersTransformation(5f, 5f, 5f, 5f))
} }
} }
} }
@@ -289,8 +289,8 @@ class GoodsStoreDialog(
context.toast("请采集图片") context.toast("请采集图片")
return return
} }
val unit = binding.tvProcurementUnit.text.trim().toString() val unitName = binding.tvProcurementUnit.text.trim().toString()
if (unit.isBlank()) { if (unitName.isBlank()) {
context.toast("请选择入库单位") context.toast("请选择入库单位")
return return
} }
@@ -339,9 +339,9 @@ class GoodsStoreDialog(
goodId = goods.id, goodId = goods.id,
goodName = goods.goodsName, goodName = goods.goodsName,
consumeValue = goods.purchaseValue, consumeValue = goods.purchaseValue,
//goodsPurId = binding.tvProcurementUnit.tag.toString(), goodsPurId = binding.tvProcurementUnit.tag.toString(),
kcUnitId = binding.tvProcurementUnit.tag.toString(), kcUnitId = goods.unit,
unitName = unit, unitName = unitName,
//收货接口-数量 //收货接口-数量
receivedNum = count, receivedNum = count,
//收货接口-单价(含税) //收货接口-单价(含税)
@@ -66,6 +66,7 @@ data class SearchGoodsInfo(
*/ */
val consumeValue: String? = "", val consumeValue: String? = "",
val purchaseValue: String? = "", val purchaseValue: String? = "",
val unit: String? = "",
@SerializedName("specification") @SerializedName("specification")
val specification: String? = "", val specification: String? = "",
@@ -48,7 +48,7 @@ fun HomeScreen(
// 避免每次进入都获取字典类型 // 避免每次进入都获取字典类型
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
Timber.d("LaunchedEffect(Unit)") Timber.d("LaunchedEffect(Unit)")
viewModel.getInitInfo() // viewModel.getInitInfo()
} }
BackHandler { BackHandler {
@@ -21,18 +21,18 @@ class UserViewModel @Inject constructor(
private val repo: RemoteRepository private val repo: RemoteRepository
) : BaseViewModel(repo) { ) : BaseViewModel(repo) {
private var isFirstLaunch by mutableStateOf(true) // private var isFirstLaunch by mutableStateOf(true)
private val _user = MutableStateFlow<User?>(null) private val _user = MutableStateFlow<User?>(null)
val user = _user.asStateFlow() val user = _user.asStateFlow()
fun getInitInfo() { fun getInitInfo() {
Timber.d("getInitInfo isFirstLaunch = $isFirstLaunch") // Timber.d("getInitInfo isFirstLaunch = $isFirstLaunch")
//if (isFirstLaunch) { //if (isFirstLaunch) {
getUserInfo() // getUserInfo()
getDictType() getDictType()
isFirstLaunch = false // isFirstLaunch = false
//} //}
} }
@@ -10,8 +10,14 @@
android:id="@+id/imageView" android:id="@+id/imageView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="center"/>
<ImageView
android:id="@+id/ivCameraFlag"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center" android:scaleType="center"
tools:src="@mipmap/ic_camera256"/> android:src="@mipmap/ic_camera256"/>
<ImageView <ImageView
android:id="@+id/ivDelete" android:id="@+id/ivDelete"