feat: 国际进港舱单分单编辑页主分校验功能
将主分校验从接口查询改为本地实时计算,显示"分单之和/主单"格式, 超出主单时红色提示并禁止保存,品名(中)优先取goodsCn兜底取goods。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -31,15 +31,28 @@ class IntImpManifestSubEditActivity :
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val KEY_MAIN_PC = "mainPc"
|
||||
const val KEY_MAIN_WEIGHT = "mainWeight"
|
||||
const val KEY_OTHER_SUB_PC = "otherSubPc"
|
||||
const val KEY_OTHER_SUB_WEIGHT = "otherSubWeight"
|
||||
|
||||
/**
|
||||
* 新增分单
|
||||
*/
|
||||
@JvmStatic
|
||||
fun startForAdd(context: Context, manifest: GjjManifest) {
|
||||
// 新增模式:其他分单之和 = 所有已有分单之和
|
||||
val otherSubPc = manifest.haWbList?.sumOf { it.pc } ?: 0L
|
||||
val otherSubWeight = manifest.haWbList?.sumOf { it.weight } ?: 0.0
|
||||
|
||||
context.startActivity(
|
||||
Intent(context, IntImpManifestSubEditActivity::class.java)
|
||||
.putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Add.name)
|
||||
.putExtra(Constant.Key.BEAN, manifest)
|
||||
.putExtra(KEY_MAIN_PC, manifest.pc)
|
||||
.putExtra(KEY_MAIN_WEIGHT, manifest.weight)
|
||||
.putExtra(KEY_OTHER_SUB_PC, otherSubPc)
|
||||
.putExtra(KEY_OTHER_SUB_WEIGHT, otherSubWeight)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -48,11 +61,19 @@ class IntImpManifestSubEditActivity :
|
||||
*/
|
||||
@JvmStatic
|
||||
fun startForModify(context: Context, manifest: GjjManifest, haWb: GjjHaWb) {
|
||||
// 修改模式:其他分单之和 = 所有分单之和 - 当前编辑的分单
|
||||
val otherSubPc = (manifest.haWbList?.sumOf { it.pc } ?: 0L) - haWb.pc
|
||||
val otherSubWeight = (manifest.haWbList?.sumOf { it.weight } ?: 0.0) - haWb.weight
|
||||
|
||||
context.startActivity(
|
||||
Intent(context, IntImpManifestSubEditActivity::class.java)
|
||||
.putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Modify.name)
|
||||
.putExtra(Constant.Key.BEAN, manifest)
|
||||
.putExtra("haWb", haWb)
|
||||
.putExtra(KEY_MAIN_PC, manifest.pc)
|
||||
.putExtra(KEY_MAIN_WEIGHT, manifest.weight)
|
||||
.putExtra(KEY_OTHER_SUB_PC, otherSubPc)
|
||||
.putExtra(KEY_OTHER_SUB_WEIGHT, otherSubWeight)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.lukouguoji.gjj.viewModel
|
||||
import android.content.Intent
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.lukouguoji.gjj.activity.IntImpManifestSubEditActivity
|
||||
import com.lukouguoji.module_base.base.BaseViewModel
|
||||
import com.lukouguoji.module_base.bean.GjjHaWb
|
||||
import com.lukouguoji.module_base.bean.GjjManifest
|
||||
@@ -11,7 +12,6 @@ import com.lukouguoji.module_base.common.ConstantEvent
|
||||
import com.lukouguoji.module_base.common.DetailsPageType
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.impl.FlowBus
|
||||
import com.lukouguoji.module_base.ktx.launchCollect
|
||||
import com.lukouguoji.module_base.ktx.launchLoadingCollect
|
||||
import com.lukouguoji.module_base.ktx.noNull
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
@@ -44,6 +44,17 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
|
||||
val weight = MutableLiveData("") // 重量
|
||||
val goodsCn = MutableLiveData("") // 品名(中)
|
||||
|
||||
// 主单件数/重量
|
||||
private var mainPc: Long = 0
|
||||
private var mainWeight: Double = 0.0
|
||||
|
||||
// 其他分单件数/重量之和(不含当前编辑的分单)
|
||||
private var otherSubPc: Long = 0
|
||||
private var otherSubWeight: Double = 0.0
|
||||
|
||||
// 主分校验是否通过(true=绿色允许保存,false=红色不允许保存)
|
||||
val isCheckValid = MutableLiveData(true)
|
||||
|
||||
/**
|
||||
* 初始化(从Intent获取参数)
|
||||
*/
|
||||
@@ -61,6 +72,12 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
|
||||
waybillNo.value = manifest.getWaybillNo()
|
||||
}
|
||||
|
||||
// 获取主分校验参数
|
||||
mainPc = intent.getLongExtra(IntImpManifestSubEditActivity.KEY_MAIN_PC, 0)
|
||||
mainWeight = intent.getDoubleExtra(IntImpManifestSubEditActivity.KEY_MAIN_WEIGHT, 0.0)
|
||||
otherSubPc = intent.getLongExtra(IntImpManifestSubEditActivity.KEY_OTHER_SUB_PC, 0)
|
||||
otherSubWeight = intent.getDoubleExtra(IntImpManifestSubEditActivity.KEY_OTHER_SUB_WEIGHT, 0.0)
|
||||
|
||||
// 编辑模式:回填分单数据
|
||||
if (pageType.value == DetailsPageType.Modify) {
|
||||
val haWb = intent.getSerializableExtra("haWb") as? GjjHaWb
|
||||
@@ -69,28 +86,54 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
|
||||
subNo.value = haWb.hno
|
||||
pc.value = if (haWb.pc > 0) haWb.pc.toString() else ""
|
||||
weight.value = if (haWb.weight > 0) haWb.weight.toString() else ""
|
||||
goodsCn.value = haWb.goodsCn
|
||||
goodsCn.value = haWb.goodsCn.ifEmpty { haWb.goods }
|
||||
}
|
||||
}
|
||||
|
||||
// 获取主分校验数据
|
||||
loadMainSubCheck()
|
||||
// 计算主分校验
|
||||
updateMainSubCheck()
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取主单减去分单的件数重量
|
||||
* 件数输入完成回调
|
||||
*/
|
||||
private fun loadMainSubCheck() {
|
||||
if (mfId == 0L) return
|
||||
fun onPcInputComplete() {
|
||||
updateMainSubCheck()
|
||||
}
|
||||
|
||||
val params = mapOf("mfId" to mfId).toRequestBody()
|
||||
launchCollect({ NetApply.api.getMaWbMinusHaWb(params) }) {
|
||||
onSuccess = { result ->
|
||||
if (result.verifySuccess() && result.data != null) {
|
||||
val data = result.data!!
|
||||
mainSubCheck.value = "剩余件数:${data.pc} 剩余重量:${data.weight}"
|
||||
/**
|
||||
* 重量输入完成回调
|
||||
*/
|
||||
fun onWeightInputComplete() {
|
||||
updateMainSubCheck()
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时计算主分校验
|
||||
* 格式:分单之和件数/主单件数 分单之和重量/主单重量KG
|
||||
* 颜色:分单之和 > 主单 → 红色(不允许保存),否则 → 绿色
|
||||
*/
|
||||
private fun updateMainSubCheck() {
|
||||
val currentPc = pc.value?.toLongOrNull() ?: 0
|
||||
val currentWeight = weight.value?.toDoubleOrNull() ?: 0.0
|
||||
|
||||
val totalSubPc = otherSubPc + currentPc
|
||||
val totalSubWeight = otherSubWeight + currentWeight
|
||||
|
||||
mainSubCheck.value = "${totalSubPc}/${mainPc} ${formatWeight(totalSubWeight)}/${formatWeight(mainWeight)}KG"
|
||||
|
||||
// 件数或重量任一超过主单则校验不通过
|
||||
isCheckValid.value = totalSubPc <= mainPc && totalSubWeight <= mainWeight
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化重量显示(整数不显示小数位)
|
||||
*/
|
||||
private fun formatWeight(value: Double): String {
|
||||
return if (value % 1.0 == 0.0) {
|
||||
value.toLong().toString()
|
||||
} else {
|
||||
value.toString()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,6 +141,12 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
|
||||
* 保存
|
||||
*/
|
||||
fun onSaveClick() {
|
||||
// 主分校验不通过时禁止保存
|
||||
if (isCheckValid.value == false) {
|
||||
showToast("分单之和超过主单,不允许保存")
|
||||
return
|
||||
}
|
||||
|
||||
val params = mutableMapOf<String, Any?>(
|
||||
"mfId" to mfId,
|
||||
"prefix" to prefix,
|
||||
|
||||
@@ -375,7 +375,18 @@ class IntImpManifestViewModel : BasePageViewModel() {
|
||||
return
|
||||
}
|
||||
|
||||
IntImpManifestSubEditActivity.startForAdd(getTopActivity(), selectedItems[0])
|
||||
val manifest = selectedItems[0]
|
||||
if (manifest.haWbList == null) {
|
||||
// 分单列表未加载,先加载再跳转
|
||||
launchLoadingCollect({ NetApply.api.getIntImpManifestHaWbList(manifest.toRequestBody()) }) {
|
||||
onSuccess = { result ->
|
||||
manifest.haWbList = result.data ?: emptyList()
|
||||
IntImpManifestSubEditActivity.startForAdd(getTopActivity(), manifest)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
IntImpManifestSubEditActivity.startForAdd(getTopActivity(), manifest)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -72,7 +72,8 @@
|
||||
title='@{"主分校验"}'
|
||||
titleLength="@{5}"
|
||||
type="@{DataLayoutType.INPUT}"
|
||||
value='@{viewModel.mainSubCheck}' />
|
||||
value='@{viewModel.mainSubCheck}'
|
||||
valueTextColor="@{viewModel.isCheckValid ? @color/text_green : @color/red}" />
|
||||
|
||||
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
|
||||
android:layout_width="0dp"
|
||||
@@ -103,6 +104,7 @@
|
||||
enable="@{true}"
|
||||
hint='@{"请输入件数"}'
|
||||
required="@{false}"
|
||||
setRefreshCallBack="@{viewModel::onPcInputComplete}"
|
||||
title='@{"件 数"}'
|
||||
titleLength="@{5}"
|
||||
type="@{DataLayoutType.INPUT}"
|
||||
@@ -116,6 +118,7 @@
|
||||
enable="@{true}"
|
||||
hint='@{"请输入重量"}'
|
||||
required="@{false}"
|
||||
setRefreshCallBack="@{viewModel::onWeightInputComplete}"
|
||||
title='@{"重 量"}'
|
||||
titleLength="@{5}"
|
||||
type="@{DataLayoutType.INPUT}"
|
||||
|
||||
Reference in New Issue
Block a user