diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpManifestSubEditActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpManifestSubEditActivity.kt index cfae032..e6d038d 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpManifestSubEditActivity.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpManifestSubEditActivity.kt @@ -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) ) } } diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestSubEditViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestSubEditViewModel.kt index 8e3cfa0..18a2b89 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestSubEditViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestSubEditViewModel.kt @@ -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( "mfId" to mfId, "prefix" to prefix, diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt index f812b90..7b9b017 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt @@ -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) + } } /** diff --git a/module_gjj/src/main/res/layout/activity_int_imp_manifest_sub_edit.xml b/module_gjj/src/main/res/layout/activity_int_imp_manifest_sub_edit.xml index 98ba508..ef759d0 100644 --- a/module_gjj/src/main/res/layout/activity_int_imp_manifest_sub_edit.xml +++ b/module_gjj/src/main/res/layout/activity_int_imp_manifest_sub_edit.xml @@ -72,7 +72,8 @@ title='@{"主分校验"}' titleLength="@{5}" type="@{DataLayoutType.INPUT}" - value='@{viewModel.mainSubCheck}' /> + value='@{viewModel.mainSubCheck}' + valueTextColor="@{viewModel.isCheckValid ? @color/text_green : @color/red}" />