feat: 国际进港舱单分单编辑页主分校验功能

将主分校验从接口查询改为本地实时计算,显示"分单之和/主单"格式,
超出主单时红色提示并禁止保存,品名(中)优先取goodsCn兜底取goods。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-22 18:23:02 +08:00
parent 5e1ccc9e8a
commit 78238907b0
4 changed files with 101 additions and 17 deletions

View File

@@ -31,15 +31,28 @@ class IntImpManifestSubEditActivity :
} }
companion object { 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 @JvmStatic
fun startForAdd(context: Context, manifest: GjjManifest) { 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( context.startActivity(
Intent(context, IntImpManifestSubEditActivity::class.java) Intent(context, IntImpManifestSubEditActivity::class.java)
.putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Add.name) .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Add.name)
.putExtra(Constant.Key.BEAN, manifest) .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 @JvmStatic
fun startForModify(context: Context, manifest: GjjManifest, haWb: GjjHaWb) { 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( context.startActivity(
Intent(context, IntImpManifestSubEditActivity::class.java) Intent(context, IntImpManifestSubEditActivity::class.java)
.putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Modify.name) .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Modify.name)
.putExtra(Constant.Key.BEAN, manifest) .putExtra(Constant.Key.BEAN, manifest)
.putExtra("haWb", haWb) .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)
) )
} }
} }

View File

@@ -3,6 +3,7 @@ package com.lukouguoji.gjj.viewModel
import android.content.Intent import android.content.Intent
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.lukouguoji.gjj.activity.IntImpManifestSubEditActivity
import com.lukouguoji.module_base.base.BaseViewModel import com.lukouguoji.module_base.base.BaseViewModel
import com.lukouguoji.module_base.bean.GjjHaWb import com.lukouguoji.module_base.bean.GjjHaWb
import com.lukouguoji.module_base.bean.GjjManifest 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.common.DetailsPageType
import com.lukouguoji.module_base.http.net.NetApply import com.lukouguoji.module_base.http.net.NetApply
import com.lukouguoji.module_base.impl.FlowBus 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.launchLoadingCollect
import com.lukouguoji.module_base.ktx.noNull import com.lukouguoji.module_base.ktx.noNull
import com.lukouguoji.module_base.ktx.showToast import com.lukouguoji.module_base.ktx.showToast
@@ -44,6 +44,17 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
val weight = MutableLiveData("") // 重量 val weight = MutableLiveData("") // 重量
val goodsCn = 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获取参数 * 初始化从Intent获取参数
*/ */
@@ -61,6 +72,12 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
waybillNo.value = manifest.getWaybillNo() 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) { if (pageType.value == DetailsPageType.Modify) {
val haWb = intent.getSerializableExtra("haWb") as? GjjHaWb val haWb = intent.getSerializableExtra("haWb") as? GjjHaWb
@@ -69,28 +86,54 @@ class IntImpManifestSubEditViewModel : BaseViewModel() {
subNo.value = haWb.hno subNo.value = haWb.hno
pc.value = if (haWb.pc > 0) haWb.pc.toString() else "" pc.value = if (haWb.pc > 0) haWb.pc.toString() else ""
weight.value = if (haWb.weight > 0) haWb.weight.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() { fun onPcInputComplete() {
if (mfId == 0L) return updateMainSubCheck()
}
val params = mapOf("mfId" to mfId).toRequestBody() /**
launchCollect({ NetApply.api.getMaWbMinusHaWb(params) }) { * 重量输入完成回调
onSuccess = { result -> */
if (result.verifySuccess() && result.data != null) { fun onWeightInputComplete() {
val data = result.data!! updateMainSubCheck()
mainSubCheck.value = "剩余件数:${data.pc} 剩余重量:${data.weight}"
} }
/**
* 实时计算主分校验
* 格式:分单之和件数/主单件数 分单之和重量/主单重量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() { fun onSaveClick() {
// 主分校验不通过时禁止保存
if (isCheckValid.value == false) {
showToast("分单之和超过主单,不允许保存")
return
}
val params = mutableMapOf<String, Any?>( val params = mutableMapOf<String, Any?>(
"mfId" to mfId, "mfId" to mfId,
"prefix" to prefix, "prefix" to prefix,

View File

@@ -375,7 +375,18 @@ class IntImpManifestViewModel : BasePageViewModel() {
return 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)
}
} }
/** /**

View File

@@ -72,7 +72,8 @@
title='@{"主分校验"}' title='@{"主分校验"}'
titleLength="@{5}" titleLength="@{5}"
type="@{DataLayoutType.INPUT}" 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 <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
android:layout_width="0dp" android:layout_width="0dp"
@@ -103,6 +104,7 @@
enable="@{true}" enable="@{true}"
hint='@{"请输入件数"}' hint='@{"请输入件数"}'
required="@{false}" required="@{false}"
setRefreshCallBack="@{viewModel::onPcInputComplete}"
title='@{"件 数"}' title='@{"件 数"}'
titleLength="@{5}" titleLength="@{5}"
type="@{DataLayoutType.INPUT}" type="@{DataLayoutType.INPUT}"
@@ -116,6 +118,7 @@
enable="@{true}" enable="@{true}"
hint='@{"请输入重量"}' hint='@{"请输入重量"}'
required="@{false}" required="@{false}"
setRefreshCallBack="@{viewModel::onWeightInputComplete}"
title='@{"重 量"}' title='@{"重 量"}'
titleLength="@{5}" titleLength="@{5}"
type="@{DataLayoutType.INPUT}" type="@{DataLayoutType.INPUT}"