From b44e1a35bb2e6dcb70bcc31977b901031b076b3c Mon Sep 17 00:00:00 2001 From: zxj <275873859@qq.com> Date: Thu, 21 Aug 2025 17:01:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=89=A9=E5=93=81=E6=B6=88?= =?UTF-8?q?=E8=80=97=E5=8D=95=E4=BD=8D=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sw/inbound/model/request/GoodsAddParam.kt | 9 +- .../model/request/GoodsPurchaseUnitParam.kt | 17 +++ .../model/request/PurchaseWarehouseParam.kt | 4 +- .../inbound/model/response/SearchGoodsInfo.kt | 8 +- .../inbound/ui/page/ReceiptProductScreen.kt | 2 +- .../inbound/ui/page/SelfProcurementScreen.kt | 116 ++++++++++++++---- .../com/sw/inbound/ui/weight/IdentityView.kt | 22 +++- .../ui/weight/dialog/AddProductDialog.kt | 2 +- .../ui/weight/dialog/AddPurchaseUnitDialog.kt | 2 +- .../ui/weight/dialog/ReceiptTipDialog.kt | 2 +- .../java/com/sw/inbound/utils/ToastUtils.kt | 2 +- .../viewmodel/SelfProcurementViewModel.kt | 6 +- .../java/com/sw/inbound/ExampleUnitTest.kt | 11 ++ 13 files changed, 171 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/sw/inbound/model/request/GoodsAddParam.kt b/app/src/main/java/com/sw/inbound/model/request/GoodsAddParam.kt index 69a8caf..ae7a177 100644 --- a/app/src/main/java/com/sw/inbound/model/request/GoodsAddParam.kt +++ b/app/src/main/java/com/sw/inbound/model/request/GoodsAddParam.kt @@ -56,7 +56,11 @@ data class GoodsAddParam( /** * 图片url */ - var relativeUrl: String? = null + var relativeUrl: String? = null, + /** + * 库存与克的转换值 + */ + val consumeValue: String = "" ) { val goodNameSr: String @@ -138,6 +142,9 @@ data class GoodsAddParam( if (purchasePrice == null || purchasePrice!!.toFloat() <= 0) { return "请输入单价" } + if (consumeValue.isEmpty()) { + return "请输入库存单位对应的消耗值" + } return null } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/model/request/GoodsPurchaseUnitParam.kt b/app/src/main/java/com/sw/inbound/model/request/GoodsPurchaseUnitParam.kt index 1122042..c2a935d 100644 --- a/app/src/main/java/com/sw/inbound/model/request/GoodsPurchaseUnitParam.kt +++ b/app/src/main/java/com/sw/inbound/model/request/GoodsPurchaseUnitParam.kt @@ -7,8 +7,21 @@ data class GoodsPurchaseUnitParam( val purchaseUnit: Int = 0, // 采购单位 integer , val unitId: Int = 0, // 库存单位id integer, val purchaseValue: Float = 0f, // 单位转换值 float + /** + * 库存与克的转换值 + */ + var consumeValue: String = "", + val consumeValueTemp: String = "", ) { + val consumeValueTempValue: String + get() { + if (consumeValue.isNotEmpty()) { + return consumeValue + } + return consumeValueTemp + } + val unitIdStr: String get() { if (unitId == 0) return "" @@ -35,6 +48,10 @@ data class GoodsPurchaseUnitParam( if (purchaseValue == null || purchaseValue == 0f) { return "请输入采购单位对应的库存数量" } + if (consumeValueTemp.isEmpty()) { + return "请输入库存单位对应的消耗值" + } + consumeValue = consumeValueTemp return null } } diff --git a/app/src/main/java/com/sw/inbound/model/request/PurchaseWarehouseParam.kt b/app/src/main/java/com/sw/inbound/model/request/PurchaseWarehouseParam.kt index dc12e2d..ff5e99b 100644 --- a/app/src/main/java/com/sw/inbound/model/request/PurchaseWarehouseParam.kt +++ b/app/src/main/java/com/sw/inbound/model/request/PurchaseWarehouseParam.kt @@ -68,7 +68,9 @@ data class PurchaseWarehouseParam( // 搜索的物品单位列表 var unitList: List? = null, // 选中的采购单位 - var selectUnitType: UnitVo? = null + var selectUnitType: UnitVo? = null, + // 库存单位与克的转换值 + val consumeValue: String = "" ) : Parcelable { val warehouseNameStr: String diff --git a/app/src/main/java/com/sw/inbound/model/response/SearchGoodsInfo.kt b/app/src/main/java/com/sw/inbound/model/response/SearchGoodsInfo.kt index 487ae68..f4b3837 100644 --- a/app/src/main/java/com/sw/inbound/model/response/SearchGoodsInfo.kt +++ b/app/src/main/java/com/sw/inbound/model/response/SearchGoodsInfo.kt @@ -53,6 +53,12 @@ data class SearchGoodsInfo( */ @SerializedName("kcUnitName") val kcUnitName: String? = "", + + /** + * 库存与克的转换值 + */ + val consumeValue: String? = "", + @SerializedName("specification") val specification: String? = "", @SerializedName("typeId") @@ -63,7 +69,7 @@ data class SearchGoodsInfo( * 采购单位列表 */ @SerializedName("unitVoList") - val unitVoList: List? = null, + val unitVoList: List? = listOf(), @SerializedName("zjmCode") val zjmCode: String? = "" ) : Parcelable { diff --git a/app/src/main/java/com/sw/inbound/ui/page/ReceiptProductScreen.kt b/app/src/main/java/com/sw/inbound/ui/page/ReceiptProductScreen.kt index 0c7d710..6d695b1 100644 --- a/app/src/main/java/com/sw/inbound/ui/page/ReceiptProductScreen.kt +++ b/app/src/main/java/com/sw/inbound/ui/page/ReceiptProductScreen.kt @@ -218,7 +218,7 @@ fun ReceiptLeftView( "采购单号:${currentPurchaseInfo?.purCode ?: "-"}", style = gray96a0aaTextStyle.copy(fontSize = 20.sp) ) - Spacer(modifier = Modifier.width(120.dp)) + Spacer(modifier = Modifier.width(30.dp)) Text( "收货单号:${currentPurchaseInfo?.receiveCode ?: "-"}", style = gray96a0aaTextStyle.copy(fontSize = 20.sp) diff --git a/app/src/main/java/com/sw/inbound/ui/page/SelfProcurementScreen.kt b/app/src/main/java/com/sw/inbound/ui/page/SelfProcurementScreen.kt index e24c01a..0eae923 100644 --- a/app/src/main/java/com/sw/inbound/ui/page/SelfProcurementScreen.kt +++ b/app/src/main/java/com/sw/inbound/ui/page/SelfProcurementScreen.kt @@ -266,9 +266,10 @@ fun ProductIdentification(viewModel: SelfProcurementViewModel) { .fillMaxWidth() ) { // 菜品识别 - IdentityView(showSearchView = true, onOptionSelected = { - viewModel.updateSelectedItemWithSearch(it) - }, + IdentityView( + showSearchView = true, onOptionSelected = { + viewModel.updateSelectedItemWithSearch(it) + }, checkedItem = selectedItem, baseViewModel = viewModel, pageType = PageType.SELF_PROCUREMENT @@ -349,14 +350,26 @@ private fun DialogRightEditView(viewModel: SelfProcurementViewModel) { onValueChange = { viewModel.updateGoodsAddParam(goodsAddParam.copy(goodName = it)) }) +// ColumnInputText( +// modifier = Modifier.width(474.dp), +// label = "物品编码(系统生成)", +// value = "", +// enabled = false, +// onValueChange = { +//// viewModel.updateFormState(formState.copy(goodCode = it)) +// }) + ColumnInputText( - modifier = Modifier.width(474.dp), - label = "物品编码(系统生成)", - value = "", - enabled = false, + modifier = Modifier + .weight(1f) + .width(474.dp), + label = "净材率", + value = goodsAddParam.netRateStr, + inputType = InputType.Percent, onValueChange = { -// viewModel.updateFormState(formState.copy(goodCode = it)) - }) + viewModel.updateGoodsAddParam(goodsAddParam.copy(netRate = it.toSafeFloat())) + }, trailingLabel = "%" + ) } Row( modifier = Modifier.fillMaxWidth(), @@ -397,17 +410,7 @@ private fun DialogRightEditView(viewModel: SelfProcurementViewModel) { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(60.dp) ) { - ColumnInputText( - modifier = Modifier - .weight(1f) - .width(474.dp), - label = "净材率", - value = goodsAddParam.netRateStr, - inputType = InputType.Percent, - onValueChange = { - viewModel.updateGoodsAddParam(goodsAddParam.copy(netRate = it.toSafeFloat())) - }, trailingLabel = "%" - ) + ColumnInputText( modifier = Modifier.width(474.dp), value = goodsAddParam.unitIdStr, @@ -421,6 +424,7 @@ private fun DialogRightEditView(viewModel: SelfProcurementViewModel) { ) }, ) + } Column { @@ -477,12 +481,45 @@ private fun DialogRightEditView(viewModel: SelfProcurementViewModel) { if (it.isValidAmount()) { viewModel.updateGoodsAddParam(goodsAddParam.copy(purchasePrice = it.toSafeBigDecimal())) } - }, inputType = InputType.Decimal, hasNext = false + }, inputType = InputType.Decimal, hasNext = true ) Spacer(modifier = Modifier.width(24.dp)) Text("元", style = AppTypography.gray96a0aaTextStyle) } } + + Column { + Text(text = "消耗单位", style = AppTypography.black141428TextStyle) + Spacer(modifier = Modifier.height(20.dp)) + Row( + modifier = Modifier + .height(92.dp) + .fillMaxWidth() + .dashedBorder() + .padding(vertical = 16.dp, horizontal = 26.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text("1", style = AppTypography.black141428TextStyle.bold()) + Spacer(modifier = Modifier.width(24.dp)) + Text(goodsAddParam.unitIdStr, style = AppTypography.gray96a0aaTextStyle) + Spacer(modifier = Modifier.width(24.dp)) + Text(text = "=", style = AppTypography.gray96a0aaTextStyle) + Spacer(modifier = Modifier.width(24.dp)) + CustomTextField( + modifier = Modifier.width(200.dp), + value = goodsAddParam.consumeValue, + placeholderValue = "请录入", + isInitUpdate = true, + onValueChange = { + viewModel.updateGoodsAddParam(goodsAddParam.copy(consumeValue = it)) + }, inputType = InputType.Decimal, hasNext = false + ) + Spacer(modifier = Modifier.width(24.dp)) + Text("克", style = AppTypography.gray96a0aaTextStyle) + } + } + Spacer(modifier = Modifier.height(24.dp)) } } @@ -592,6 +629,39 @@ private fun DialogAddPurchaseUnitEditView(viewModel: SelfProcurementViewModel) { } } + Column { + Text(text = "消耗单位", style = AppTypography.black141428TextStyle) + Spacer(modifier = Modifier.height(20.dp)) + Row( + modifier = Modifier + .height(92.dp) + .fillMaxWidth() + .dashedBorder() + .padding(vertical = 16.dp, horizontal = 26.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text("1", style = AppTypography.black141428TextStyle.bold()) + Spacer(modifier = Modifier.width(24.dp)) + Text(goodsAddUnitParam.unitIdStr, style = AppTypography.gray96a0aaTextStyle) + Spacer(modifier = Modifier.width(24.dp)) + Text(text = "=", style = AppTypography.gray96a0aaTextStyle) + Spacer(modifier = Modifier.width(24.dp)) + CustomTextField( + modifier = Modifier.width(260.dp), + value = goodsAddUnitParam.consumeValueTempValue, + isInitUpdate = true, + placeholderValue = "请录入", + enabled = goodsAddUnitParam.consumeValue.isEmpty(), + onValueChange = { + viewModel.updateGoodsPurchaseUnit(goodsAddUnitParam.copy(consumeValueTemp = it)) + }, inputType = InputType.Decimal, hasNext = false + ) + Spacer(modifier = Modifier.width(24.dp)) + Text("克", style = AppTypography.gray96a0aaTextStyle) + } + } + Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, @@ -602,6 +672,7 @@ private fun DialogAddPurchaseUnitEditView(viewModel: SelfProcurementViewModel) { style = AppTypography.gray999999TextStyle ) } + Spacer(modifier = Modifier.height(24.dp)) } } @@ -734,7 +805,8 @@ private fun SelfProductEditView( viewModel.updateGoodsPurchaseUnit( goodsAddUnitParam.copy( goodsId = selectedItem!!.goodsId, - unitId = selectedItem!!.kcUnitId + unitId = selectedItem!!.kcUnitId, + consumeValue = selectedItem!!.consumeValue ) ) viewModel.updateAddPurchaseUnitDialog(true) diff --git a/app/src/main/java/com/sw/inbound/ui/weight/IdentityView.kt b/app/src/main/java/com/sw/inbound/ui/weight/IdentityView.kt index 9a7c06d..5a7053e 100644 --- a/app/src/main/java/com/sw/inbound/ui/weight/IdentityView.kt +++ b/app/src/main/java/com/sw/inbound/ui/weight/IdentityView.kt @@ -30,6 +30,8 @@ import com.sw.inbound.ui.theme.AppTypography import com.sw.inbound.utils.InteractionUtils.Debouncer import com.sw.inbound.utils.rememberPhotoCapture import com.sw.inbound.viewmodel.BaseViewModel +import com.sw.inbound.viewmodel.ReceiptViewModel +import com.sw.inbound.viewmodel.SelfProcurementViewModel import timber.log.Timber enum class PageType { @@ -94,6 +96,11 @@ fun IdentityView( // 处理拍照成功的逻辑 baseViewModel.updateLastPhotoUri(savedUri) Timber.d("photoUri = $savedUri") + if (pageType == PageType.SELF_PROCUREMENT) { + (baseViewModel as SelfProcurementViewModel).updateSelectedItem(null) + } else if (pageType == PageType.RECEIPT_PRODUCT) { + (baseViewModel as ReceiptViewModel).updateSelectedItem(null) + } baseViewModel.getIdentityList(savedUri) }, onError = { error -> @@ -113,7 +120,17 @@ fun IdentityView( Timber.d("LaunchedEffect weightInfo1 = $weightInfo, lastWeight = $lastWeight") if (weightInfo - lastWeight > 1.0) { Timber.d("LaunchedEffect pageType = $pageType, receiptList = ${receiptList.size}") - if (pageType == PageType.RECEIPT_PRODUCT && receiptList.isNotEmpty() || pageType == PageType.SELF_PROCUREMENT) { + var canIdentity = false + if (pageType == PageType.RECEIPT_PRODUCT) { + val selectItem = (baseViewModel as ReceiptViewModel).selectedItem.value + canIdentity = + receiptList.isNotEmpty() && (selectItem == null || selectItem.goodId == 0) + } else if (pageType == PageType.SELF_PROCUREMENT) { + val selectItem = (baseViewModel as SelfProcurementViewModel).selectedItem.value + canIdentity = selectItem == null || selectItem.goodsId == 0 + } + Timber.d("LaunchedEffect canIdentity = $canIdentity") + if (canIdentity) { debouncer.debounce { takePhoto() } @@ -137,6 +154,9 @@ fun IdentityView( if (showSearchView) { Spacer(modifier = Modifier.height(30.dp)) CustomSearchView(onSearchClick = { + if (pageType == PageType.SELF_PROCUREMENT) { + (baseViewModel as SelfProcurementViewModel).updateSelectedItem(null) + } searchInfo = it baseViewModel.searchGoodsInfoList(it) }) diff --git a/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddProductDialog.kt b/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddProductDialog.kt index 1c50f83..5233ada 100644 --- a/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddProductDialog.kt +++ b/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddProductDialog.kt @@ -54,7 +54,6 @@ fun AddProductDialog( color = Color.White, shadowElevation = 0.dp ) { - ToastUtils.ToastComposable() Column( modifier = Modifier .fillMaxSize() @@ -96,6 +95,7 @@ fun AddProductDialog( ) } } + ToastUtils.ToastComposable() } } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddPurchaseUnitDialog.kt b/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddPurchaseUnitDialog.kt index ec4102d..942d683 100644 --- a/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddPurchaseUnitDialog.kt +++ b/app/src/main/java/com/sw/inbound/ui/weight/dialog/AddPurchaseUnitDialog.kt @@ -55,7 +55,6 @@ fun AddPurchaseUnitDialog( color = Color.White, shadowElevation = 0.dp ) { - ToastUtils.ToastComposable() Column( modifier = Modifier .fillMaxSize() @@ -98,6 +97,7 @@ fun AddPurchaseUnitDialog( ) } } + ToastUtils.ToastComposable() } } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/ui/weight/dialog/ReceiptTipDialog.kt b/app/src/main/java/com/sw/inbound/ui/weight/dialog/ReceiptTipDialog.kt index e0640a6..639fe7f 100644 --- a/app/src/main/java/com/sw/inbound/ui/weight/dialog/ReceiptTipDialog.kt +++ b/app/src/main/java/com/sw/inbound/ui/weight/dialog/ReceiptTipDialog.kt @@ -69,7 +69,6 @@ fun ReceiptTipDialog( color = Color.White, shadowElevation = 0.dp ) { - ToastUtils.ToastComposable() Column( modifier = Modifier .fillMaxSize() @@ -223,6 +222,7 @@ fun ReceiptTipDialog( ) } } + ToastUtils.ToastComposable() } } } diff --git a/app/src/main/java/com/sw/inbound/utils/ToastUtils.kt b/app/src/main/java/com/sw/inbound/utils/ToastUtils.kt index 1f2f43f..3f83e7b 100644 --- a/app/src/main/java/com/sw/inbound/utils/ToastUtils.kt +++ b/app/src/main/java/com/sw/inbound/utils/ToastUtils.kt @@ -39,7 +39,7 @@ object ToastUtils { modifier = Modifier // .fillMaxWidth() .fillMaxSize() - .padding(bottom = 56.dp), + .padding(bottom = 156.dp), contentAlignment = Alignment.BottomCenter ) { Text( diff --git a/app/src/main/java/com/sw/inbound/viewmodel/SelfProcurementViewModel.kt b/app/src/main/java/com/sw/inbound/viewmodel/SelfProcurementViewModel.kt index 24a878f..c2664e5 100644 --- a/app/src/main/java/com/sw/inbound/viewmodel/SelfProcurementViewModel.kt +++ b/app/src/main/java/com/sw/inbound/viewmodel/SelfProcurementViewModel.kt @@ -262,6 +262,7 @@ class SelfProcurementViewModel @Inject constructor( goodsName = searchFirst.goodsName, kcUnitId = searchFirst.kcUnitId ?: 0, unitList = searchFirst.unitVoList, + consumeValue = searchFirst.consumeValue ?: "" ) } } @@ -369,8 +370,11 @@ class SelfProcurementViewModel @Inject constructor( val searchList: List = response.result?.records ?: emptyList() if (searchList.isNotEmpty()) { + val searchItem = searchList[0] _selectedItem.value = _selectedItem.value?.copy( - unitList = searchList[0].unitVoList + unitList = searchItem.unitVoList, + kcUnitId = searchItem.kcUnitId ?: 0, + consumeValue = searchItem.consumeValue ?: "" ) } } diff --git a/app/src/test/java/com/sw/inbound/ExampleUnitTest.kt b/app/src/test/java/com/sw/inbound/ExampleUnitTest.kt index e425cc4..235a850 100644 --- a/app/src/test/java/com/sw/inbound/ExampleUnitTest.kt +++ b/app/src/test/java/com/sw/inbound/ExampleUnitTest.kt @@ -12,12 +12,23 @@ class ExampleUnitTest { @Test fun addition_isCorrect() { // println(4, 2 + 2) + val decimalPlaces = 2 + val r1 = "%.${decimalPlaces}f".format(0.1) + logStr("r1", r1) + val r2 = "%.${decimalPlaces}f".format(1.0) + logStr("r2", r2) + val r3 = "%.${decimalPlaces}f".format(1.23) + logStr("r3", r3) } fun log(tag: String, msg: Boolean) { println("$tag, result = $msg") } + fun logStr(tag: String, msg: String) { + println("$tag, result = $msg") + } + @Test fun testFloat() { log("0.00", "0.00".isValidFloat())