From d31e78ff49fe0c4360a95dbc08b957769f2b93f9 Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Fri, 13 Mar 2026 12:44:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E9=99=85=E8=BF=9B=E6=B8=AF?= =?UTF-8?q?=E7=90=86=E8=B4=A7=E6=8A=A5=E5=91=8A=E5=9B=9B=E4=B8=AA=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=8C=89=E9=92=AE=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现人工放行、状态重置、删除理货、理货申报四个按钮的完整业务逻辑, 新增删除申报和状态重置弹框组件,对接后端API接口。 Co-Authored-By: Claude Opus 4.6 --- .../lukouguoji/module_base/http/net/Api.kt | 24 +++ .../dialog/IntImpTallyDeleteDialogModel.kt | 58 ++++++++ .../gjj/dialog/IntImpTallyResetDialogModel.kt | 66 +++++++++ .../gjj/viewModel/IntImpTallyViewModel.kt | 126 +++++++++++++--- .../layout/dialog_int_imp_tally_delete.xml | 138 ++++++++++++++++++ .../res/layout/dialog_int_imp_tally_reset.xml | 87 +++++++++++ 6 files changed, 479 insertions(+), 20 deletions(-) create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyDeleteDialogModel.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyResetDialogModel.kt create mode 100644 module_gjj/src/main/res/layout/dialog_int_imp_tally_delete.xml create mode 100644 module_gjj/src/main/res/layout/dialog_int_imp_tally_reset.xml diff --git a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt index e598426..dd64d48 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt @@ -1902,6 +1902,30 @@ interface Api { @POST("IntImpTally/listHaWb") suspend fun getIntImpTallySubList(@Body data: RequestBody): BaseResultBean> + /** + * 国际进港理货-人工放行 + */ + @POST("IntImpTally/customCommand") + suspend fun intImpTallyCustomCommand(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港理货-状态重置 + */ + @POST("IntImpTally/resetDeclare") + suspend fun intImpTallyResetDeclare(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港理货-删除申报 + */ + @POST("IntImpTally/deleteDeclare") + suspend fun intImpTallyDeleteDeclare(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港理货-理货申报 + */ + @POST("IntImpTally/declare") + suspend fun intImpTallyDeclare(@Body data: RequestBody): BaseResultBean + /** * 国际进港舱单-货物发放 */ diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyDeleteDialogModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyDeleteDialogModel.kt new file mode 100644 index 0000000..58663e6 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyDeleteDialogModel.kt @@ -0,0 +1,58 @@ +package com.lukouguoji.gjj.dialog + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.databinding.DialogIntImpTallyDeleteBinding +import com.lukouguoji.module_base.base.BaseDialogModel +import com.lukouguoji.module_base.ktx.verifyNullOrEmpty +import dev.utils.app.info.KeyValue + +/** + * 国际进港理货 - 删除申报对话框 + */ +class IntImpTallyDeleteDialogModel( + val changeReasonList: List, // 变更原因列表 + private val callback: (IntImpTallyDeleteDialogModel) -> Unit +) : BaseDialogModel(DIALOG_TYPE_CENTER) { + + // 变更原因代码(存储的是 code) + val changeReason = MutableLiveData("") + + // 联系人姓名 + val contactName = MutableLiveData("") + + // 联系人电话 + val contactPhone = MutableLiveData("") + + override fun layoutId(): Int { + return R.layout.dialog_int_imp_tally_delete + } + + override fun onDialogCreated(context: Context) { + binding.model = this + } + + /** + * 确认按钮点击 + */ + fun onConfirmClick() { + // 验证变更原因 + if (changeReason.value.verifyNullOrEmpty("请选择变更原因")) { + return + } + + // 验证联系人姓名 + if (contactName.value.verifyNullOrEmpty("请输入联系人姓名")) { + return + } + + // 验证联系人电话 + if (contactPhone.value.verifyNullOrEmpty("请输入联系人电话")) { + return + } + + dismiss() + callback(this) + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyResetDialogModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyResetDialogModel.kt new file mode 100644 index 0000000..2296508 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpTallyResetDialogModel.kt @@ -0,0 +1,66 @@ +package com.lukouguoji.gjj.dialog + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.databinding.DialogIntImpTallyResetBinding +import com.lukouguoji.module_base.base.BaseDialogModel +import com.lukouguoji.module_base.ktx.verifyNullOrEmpty +import dev.utils.app.info.KeyValue + +/** + * 国际进港理货 - 状态重置对话框 + */ +class IntImpTallyResetDialogModel( + private val callback: (IntImpTallyResetDialogModel) -> Unit +) : BaseDialogModel(DIALOG_TYPE_CENTER) { + + // 重置状态列表 + val resetStatusList = MutableLiveData>() + + // 选中的重置状态(存储的是value) + val selectedResetStatus = MutableLiveData("") + + // 重置状态code (传给后端的restStatus参数) + var resetStatusCode: String? = null + + override fun layoutId(): Int { + return R.layout.dialog_int_imp_tally_reset + } + + override fun onDialogCreated(context: Context) { + binding.model = this + initResetStatusList() + + // 监听选择变化,更新resetStatusCode + selectedResetStatus.observeForever { value -> + resetStatusCode = when (value) { + "01" -> "01" // 正常 + "02" -> null // 未申报 + else -> null + } + } + } + + /** + * 初始化重置状态列表 + */ + private fun initResetStatusList() { + val list = listOf( + KeyValue("正常", "01"), + KeyValue("未申报", "02") + ) + resetStatusList.value = list + } + + /** + * 保存按钮点击 + */ + fun onSaveClick() { + if (selectedResetStatus.value.verifyNullOrEmpty("请选择重置状态")) { + return + } + dismiss() + callback(this) + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpTallyViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpTallyViewModel.kt index d7423fa..3b31515 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpTallyViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpTallyViewModel.kt @@ -3,10 +3,13 @@ package com.lukouguoji.gjj.viewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.dialog.IntImpTallyDeleteDialogModel +import com.lukouguoji.gjj.dialog.IntImpTallyResetDialogModel import dev.utils.common.DateUtils import com.lukouguoji.module_base.ktx.formatDate import com.lukouguoji.gjj.holder.IntImpTallyViewHolder import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.GjjDeclareParam import com.lukouguoji.module_base.bean.GjjImportTally import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.ConstantEvent @@ -94,63 +97,146 @@ class IntImpTallyViewModel : BasePageViewModel() { } /** - * 人工放行(暂不实现) + * 收集选中的主单和分单 + */ + private fun getSelectedData(): Pair, List> { + val list = pageModel.rv?.commonAdapter()?.items as? List + ?: return Pair(emptyList(), emptyList()) + val selectedMaWb = list.filter { it.isSelected } + val selectedHaWb = mutableListOf() + list.forEach { maWb -> + maWb.haWbList?.forEach { haWb -> + if (haWb.isSelected) selectedHaWb.add(haWb) + } + } + return Pair(selectedMaWb, selectedHaWb) + } + + /** + * 人工放行 */ fun manualReleaseClick() { - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - val selectedItems = list.filter { it.isSelected } + val (selectedMaWb, selectedHaWb) = getSelectedData() - if (selectedItems.isEmpty()) { + if (selectedMaWb.isEmpty() && selectedHaWb.isEmpty()) { showToast("请选择要放行的记录") return } - showToast("人工放行功能开发中") + val param = GjjDeclareParam( + mtallyList = if (selectedMaWb.isNotEmpty()) selectedMaWb else null, + htallyList = if (selectedHaWb.isNotEmpty()) selectedHaWb else null + ) + + launchLoadingCollect({ NetApply.api.intImpTallyCustomCommand(param.toRequestBody()) }) { + onSuccess = { + showToast("人工放行成功") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } } /** - * 状态重置(暂不实现) + * 状态重置 */ fun statusResetClick() { - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - val selectedItems = list.filter { it.isSelected } + val (selectedMaWb, selectedHaWb) = getSelectedData() - if (selectedItems.isEmpty()) { + if (selectedMaWb.isEmpty() && selectedHaWb.isEmpty()) { showToast("请选择要重置的记录") return } - showToast("状态重置功能开发中") + val dialog = IntImpTallyResetDialogModel { dialogModel -> + val param = GjjDeclareParam( + mtallyList = if (selectedMaWb.isNotEmpty()) selectedMaWb else null, + htallyList = if (selectedHaWb.isNotEmpty()) selectedHaWb else null, + restStatus = dialogModel.resetStatusCode + ) + + launchLoadingCollect({ NetApply.api.intImpTallyResetDeclare(param.toRequestBody()) }) { + onSuccess = { + showToast("状态重置成功") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } + } + + dialog.show() } /** - * 删除理货(暂不实现) + * 删除理货 */ fun deleteTallyClick() { - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - val selectedItems = list.filter { it.isSelected } + val (selectedMaWb, selectedHaWb) = getSelectedData() - if (selectedItems.isEmpty()) { + if (selectedMaWb.isEmpty() && selectedHaWb.isEmpty()) { showToast("请选择要删除的记录") return } - showToast("删除理货功能开发中") + // 从接口获取删除原因列表 + launchLoadingCollect({ NetApply.api.getDelReasonList() }) { + onSuccess = { result -> + val changeReasonList = result.data?.map { it.toKeyValue() } ?: emptyList() + + val dialog = IntImpTallyDeleteDialogModel(changeReasonList) { dialogModel -> + val param = GjjDeclareParam( + dcode = dialogModel.changeReason.value ?: "", + dcontactsName = dialogModel.contactName.value ?: "", + dcontactsTel = dialogModel.contactPhone.value ?: "", + mtallyList = if (selectedMaWb.isNotEmpty()) selectedMaWb else null, + htallyList = if (selectedHaWb.isNotEmpty()) selectedHaWb else null + ) + + launchLoadingCollect({ NetApply.api.intImpTallyDeleteDeclare(param.toRequestBody()) }) { + onSuccess = { + showToast("删除申报成功") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } + } + + dialog.show() + } + } } /** - * 理货申报(暂不实现) + * 理货申报 */ fun tallyDeclareClick() { - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - val selectedItems = list.filter { it.isSelected } + val (selectedMaWb, selectedHaWb) = getSelectedData() - if (selectedItems.isEmpty()) { + if (selectedMaWb.isEmpty() && selectedHaWb.isEmpty()) { showToast("请选择要申报的记录") return } - showToast("理货申报功能开发中") + val param = GjjDeclareParam( + mtallyList = if (selectedMaWb.isNotEmpty()) selectedMaWb else null, + htallyList = if (selectedHaWb.isNotEmpty()) selectedHaWb else null + ) + + launchLoadingCollect({ NetApply.api.intImpTallyDeclare(param.toRequestBody()) }) { + onSuccess = { + showToast("理货申报成功") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } } /** diff --git a/module_gjj/src/main/res/layout/dialog_int_imp_tally_delete.xml b/module_gjj/src/main/res/layout/dialog_int_imp_tally_delete.xml new file mode 100644 index 0000000..dd5e3c1 --- /dev/null +++ b/module_gjj/src/main/res/layout/dialog_int_imp_tally_delete.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/dialog_int_imp_tally_reset.xml b/module_gjj/src/main/res/layout/dialog_int_imp_tally_reset.xml new file mode 100644 index 0000000..338827a --- /dev/null +++ b/module_gjj/src/main/res/layout/dialog_int_imp_tally_reset.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +