diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcMaWb.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcMaWb.kt index f25bb12..9e53dc2 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcMaWb.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcMaWb.kt @@ -1,6 +1,7 @@ package com.lukouguoji.module_base.bean import androidx.databinding.ObservableBoolean +import com.lukouguoji.module_base.ktx.toPlainText import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -320,12 +321,21 @@ data class GjcStorageUse( var outDate: String? = null, // 出库时间 var outOpId: String? = null, // 出库人 var outId: String? = null, // 出库人(兼容字段) - var cargoStatus: String? = null // 货物状态 + var cargoStatus: String? = null, // 货物状态 + var inPc: Long? = null, // 入库件数 + var inWeight: Double? = null, // 入库重量 + var outPc: Long? = null, // 出库件数 + var outWeight: Double? = null // 出库重量 ) { // ==================== UI扩展字段 ==================== @Transient val checked: ObservableBoolean = ObservableBoolean(false) // 选中状态 + val inPcText: String get() = inPc?.toString() ?: "" + val inWeightText: String get() = inWeight?.toPlainText() ?: "" + val outPcText: String get() = outPc?.toString() ?: "" + val outWeightText: String get() = outWeight?.toPlainText() ?: "" + // 兼容现有API的isSelected属性 var isSelected: Boolean get() = checked.get() diff --git a/module_base/src/main/java/com/lukouguoji/module_base/ktx/NumberExt.kt b/module_base/src/main/java/com/lukouguoji/module_base/ktx/NumberExt.kt index e9bacbf..a6e7b27 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/ktx/NumberExt.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/ktx/NumberExt.kt @@ -14,3 +14,9 @@ fun Number.limit(count: Int = 2): String { } return DecimalFormat(pattern.toString()).format(this) } + +/** + * 去掉无意义的小数位:12.0 -> "12",12.50 -> "12.5" + */ +fun Double.toPlainText(): String = + if (this % 1.0 == 0.0) toLong().toString() else toBigDecimal().stripTrailingZeros().toPlainString() diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpStorageUseActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpStorageUseActivity.kt index 82cada8..076516f 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpStorageUseActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpStorageUseActivity.kt @@ -3,13 +3,13 @@ package com.lukouguoji.gjc.activity import android.app.Activity import android.content.Intent import android.os.Bundle -import androidx.appcompat.app.AlertDialog import com.alibaba.android.arouter.facade.annotation.Route import com.lukouguoji.gjc.R import com.lukouguoji.gjc.databinding.ActivityIntExpStorageUseBinding import com.lukouguoji.gjc.dialog.IntExpMoveClearDialogModel import com.lukouguoji.gjc.dialog.IntExpModifyStorageDialogModel import com.lukouguoji.gjc.dialog.IntExpInStorageDialogModel +import com.lukouguoji.gjc.dialog.IntExpOutStorageDialogModel import com.lukouguoji.gjc.viewModel.IntExpStorageUseViewModel import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.common.Constant @@ -121,7 +121,7 @@ class IntExpStorageUseActivity : } /** - * 显示出库二次确认对话框 + * 显示出库操作对话框 */ fun showOutStorageDialog() { val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return @@ -139,16 +139,19 @@ class IntExpStorageUseActivity : return } - // 显示二次确认对话框 - AlertDialog.Builder(this) - .setTitle("出库确认") - .setMessage("确定要将选中的 ${selectedStorageUseList.size} 个库位执行出库操作吗?") - .setPositiveButton("确定") { _, _ -> - // 用户确认后,执行出库操作 - viewModel.performOutStorage(selectedStorageUseList) - } - .setNegativeButton("取消", null) - .show() + // 显示出库对话框,件数/重量默认取选中库位的入库件数/重量 + IntExpOutStorageDialogModel( + storageCount = selectedStorageUseList.size, + defaultPc = selectedStorageUseList.mapNotNull { it.inPc }.takeIf { it.isNotEmpty() }?.sum(), + defaultWeight = selectedStorageUseList.mapNotNull { it.inWeight }.takeIf { it.isNotEmpty() }?.sum() + ) { dialog -> + // 用户点击确定后,执行出库操作 + viewModel.performOutStorage( + dialog.pc.value?.toLongOrNull(), + dialog.weight.value?.toDoubleOrNull(), + selectedStorageUseList + ) + }.show(this) } /** @@ -177,12 +180,19 @@ class IntExpStorageUseActivity : return } - // 显示入库对话框 - IntExpInStorageDialogModel { dialog -> + // 显示入库对话框,件数/重量默认取选中运单的件数/重量 + IntExpInStorageDialogModel( + defaultPc = maWbListForInStorage.mapNotNull { it.pc }.takeIf { it.isNotEmpty() }?.sum(), + defaultWeight = maWbListForInStorage.mapNotNull { it.weight }.takeIf { it.isNotEmpty() }?.sum() + ) { dialog -> // 用户点击保存后,执行入库操作 - val locationName = dialog.locationName - val locationId = dialog.locationId - viewModel.performInStorage(locationName, locationId, maWbListForInStorage) + viewModel.performInStorage( + dialog.locationName, + dialog.locationId, + dialog.pc.value?.toLongOrNull(), + dialog.weight.value?.toDoubleOrNull(), + maWbListForInStorage + ) }.show(this) } diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpInStorageDialogModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpInStorageDialogModel.kt index bac3a9c..d1c4b12 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpInStorageDialogModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpInStorageDialogModel.kt @@ -1,6 +1,7 @@ package com.lukouguoji.gjc.dialog import android.content.Context +import android.text.InputType import androidx.lifecycle.MutableLiveData import com.lukouguoji.gjc.R import com.lukouguoji.gjc.databinding.DialogIntExpInStorageBinding @@ -8,13 +9,18 @@ import com.lukouguoji.module_base.base.BaseDialogModel import com.lukouguoji.module_base.http.net.NetApply import com.lukouguoji.module_base.ktx.launchCollect import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.ktx.toPlainText import com.lukouguoji.module_base.ktx.verifyNullOrEmpty import dev.utils.app.info.KeyValue /** * 国际出港仓库 - 入库操作对话框 + * @param defaultPc 默认件数(选中运单的件数) + * @param defaultWeight 默认重量(选中运单的重量) */ class IntExpInStorageDialogModel( + defaultPc: Long?, + defaultWeight: Double?, private val callback: (IntExpInStorageDialogModel) -> Unit ) : BaseDialogModel(DIALOG_TYPE_CENTER) { @@ -30,12 +36,20 @@ class IntExpInStorageDialogModel( // 库位名称 (后端需要的name) var locationName: String = "" + // 入库件数 + val pc = MutableLiveData(defaultPc?.toString() ?: "") + + // 入库重量 + val weight = MutableLiveData(defaultWeight?.toPlainText() ?: "") + override fun layoutId(): Int { return R.layout.dialog_int_exp_in_storage } override fun onDialogCreated(context: Context) { binding.model = this + binding.pcInput.et.inputType = InputType.TYPE_CLASS_NUMBER + binding.weightInput.et.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL loadLocationList() // 监听选择变化,更新locationId和locationName @@ -68,6 +82,14 @@ class IntExpInStorageDialogModel( if (selectedLocationCode.value.verifyNullOrEmpty("请选择库位")) { return } + if (pc.value?.toLongOrNull() == null) { + showToast("请输入正确的件数") + return + } + if (weight.value?.toDoubleOrNull() == null) { + showToast("请输入正确的重量") + return + } dismiss() callback(this) } diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpOutStorageDialogModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpOutStorageDialogModel.kt new file mode 100644 index 0000000..6f2d7ae --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/dialog/IntExpOutStorageDialogModel.kt @@ -0,0 +1,58 @@ +package com.lukouguoji.gjc.dialog + +import android.content.Context +import android.text.InputType +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.DialogIntExpOutStorageBinding +import com.lukouguoji.module_base.base.BaseDialogModel +import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.ktx.toPlainText + +/** + * 国际出港仓库 - 出库操作对话框 + * @param storageCount 选中的库位数 + * @param defaultPc 默认件数(选中库位的入库件数) + * @param defaultWeight 默认重量(选中库位的入库重量) + */ +class IntExpOutStorageDialogModel( + storageCount: Int, + defaultPc: Long?, + defaultWeight: Double?, + private val callback: (IntExpOutStorageDialogModel) -> Unit +) : BaseDialogModel(DIALOG_TYPE_CENTER) { + + val tip = "已选择 $storageCount 个库位执行出库操作" + + // 出库件数 + val pc = MutableLiveData(defaultPc?.toString() ?: "") + + // 出库重量 + val weight = MutableLiveData(defaultWeight?.toPlainText() ?: "") + + override fun layoutId(): Int { + return R.layout.dialog_int_exp_out_storage + } + + override fun onDialogCreated(context: Context) { + binding.model = this + binding.pcInput.et.inputType = InputType.TYPE_CLASS_NUMBER + binding.weightInput.et.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL + } + + /** + * 确定按钮点击 + */ + fun onSaveClick() { + if (pc.value?.toLongOrNull() == null) { + showToast("请输入正确的件数") + return + } + if (weight.value?.toDoubleOrNull() == null) { + showToast("请输入正确的重量") + return + } + dismiss() + callback(this) + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpStorageUseViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpStorageUseViewModel.kt index d1e0036..f42638b 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpStorageUseViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpStorageUseViewModel.kt @@ -225,16 +225,26 @@ class IntExpStorageUseViewModel : BasePageViewModel() { /** * 执行出库操作 + * @param pc 出库件数 + * @param weight 出库重量 * @param selectedStorageList 选中的子列表项(库位) */ - fun performOutStorage(selectedStorageList: List) { + fun performOutStorage( + pc: Long?, + weight: Double?, + selectedStorageList: List + ) { if (selectedStorageList.isEmpty()) { showToast("请选择要出库的库位") return } - // 将选中的子列表项转换为RequestBody - val params = selectedStorageList.toRequestBody() + // 构建请求参数:出库件数 + 出库重量 + 选中的子列表项 + val params = mapOf( + "pc" to pc, + "weight" to weight, + "storageUseList" to selectedStorageList + ).toRequestBody() launchLoadingCollect({ NetApply.api.outIntExpStorage(params) }) { onSuccess = { @@ -261,11 +271,15 @@ class IntExpStorageUseViewModel : BasePageViewModel() { * 执行入库操作 * @param locationName 库位名称 (后端的location字段) * @param locationId 库位ID (后端的locationId字段) + * @param pc 入库件数 + * @param weight 入库重量 * @param maWbListForInStorage 包含选中子列表项的主列表数据 */ fun performInStorage( locationName: String, locationId: String, + pc: Long?, + weight: Double?, maWbListForInStorage: List ) { if (maWbListForInStorage.isEmpty()) { @@ -278,10 +292,12 @@ class IntExpStorageUseViewModel : BasePageViewModel() { return } - // 构建请求参数:库位名称 + 库位ID + 完整的主子列表结构 + // 构建请求参数:库位名称 + 库位ID + 入库件数 + 入库重量 + 完整的主子列表结构 val params = mapOf( "location" to locationName, "locationId" to locationId.toLongOrNull(), + "pc" to pc, + "weight" to weight, "maWbList" to maWbListForInStorage ).toRequestBody() diff --git a/module_gjc/src/main/res/layout/dialog_int_exp_in_storage.xml b/module_gjc/src/main/res/layout/dialog_int_exp_in_storage.xml index 0d6fee6..9896633 100644 --- a/module_gjc/src/main/res/layout/dialog_int_exp_in_storage.xml +++ b/module_gjc/src/main/res/layout/dialog_int_exp_in_storage.xml @@ -62,6 +62,60 @@ + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/layout/dialog_int_exp_out_storage.xml b/module_gjc/src/main/res/layout/dialog_int_exp_out_storage.xml new file mode 100644 index 0000000..faefc73 --- /dev/null +++ b/module_gjc/src/main/res/layout/dialog_int_exp_out_storage.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/layout/item_int_exp_storage_use.xml b/module_gjc/src/main/res/layout/item_int_exp_storage_use.xml index e9156dc..2c2e3b6 100644 --- a/module_gjc/src/main/res/layout/item_int_exp_storage_use.xml +++ b/module_gjc/src/main/res/layout/item_int_exp_storage_use.xml @@ -402,6 +402,26 @@ android:textSize="14sp" android:textStyle="bold" /> + + + + + + + + + + + + + + + + + + + +