From 936af73ec05ff30bd1099799d7b56a6e9a2846cf Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Wed, 1 Apr 2026 18:23:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E9=99=85=E8=BF=9B=E6=B8=AF?= =?UTF-8?q?=E8=88=B1=E5=8D=95=E4=B8=BB=E5=88=86=E5=8D=95=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=8F=8A=E5=88=86=E7=A6=BB=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主分单选择解除联动,删除操作使用独立接口,先删分单再删主单 Co-Authored-By: Claude Opus 4.6 --- .claude/settings.local.json | 5 +- .../lukouguoji/module_base/http/net/Api.kt | 12 +++ .../gjj/holder/IntImpManifestSubViewHolder.kt | 9 --- .../gjj/holder/IntImpManifestViewHolder.kt | 3 - .../gjj/viewModel/IntImpManifestViewModel.kt | 77 ++++++++++++------- 5 files changed, 64 insertions(+), 42 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index eb9c8d0..09b069f 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -116,7 +116,10 @@ "Bash(echo \"exit:$?\")", "mcp__apifox__read_project_oas_j7j64k", "mcp__apifox__read_project_oas_ref_resources_j7j64k", - "mcp__apifox__read_project_oas_ruugy8" + "mcp__apifox__read_project_oas_ruugy8", + "mcp__apifox__read_project_oas_ref_resources_ldmedm", + "mcp__apifox__read_project_oas_ldmedm", + "mcp__apifox__refresh_project_oas_ldmedm" ], "deny": [], "ask": [] 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 3968ae7..775ddf4 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 @@ -1280,6 +1280,18 @@ interface Api { @POST("IntImpManiFest/deleteFestList") suspend fun gjjManifestDeleteBatch(@Body data: RequestBody): BaseResultBean + /** + * 删除舱单(主单)- 请求体为 GjjManifest 对象数组 + */ + @POST("IntImpManifest/deleteManifest") + suspend fun intImpManifestDeleteManifest(@Body data: RequestBody): BaseResultBean + + /** + * 删除分单 - 请求体为 GjjHaWb 对象数组 + */ + @POST("IntImpManifest/deleteHawb") + suspend fun intImpManifestDeleteHawb(@Body data: RequestBody): BaseResultBean + /** * 新增-国际进港舱单 */ diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestSubViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestSubViewHolder.kt index fb354d3..10aaa09 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestSubViewHolder.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestSubViewHolder.kt @@ -1,11 +1,9 @@ package com.lukouguoji.gjj.holder import android.view.View -import androidx.recyclerview.widget.RecyclerView import com.lukouguoji.gjj.databinding.ItemIntImpManifestSubBinding import com.lukouguoji.module_base.base.BaseViewHolder import com.lukouguoji.module_base.bean.GjjHaWb -import com.lukouguoji.module_base.bean.GjjManifest /** * 国际进港舱单 - 分单子列表 ViewHolder @@ -24,13 +22,6 @@ class IntImpManifestSubViewHolder(view: View) : val newCheckedState = !bean.checked.get() bean.checked.set(newCheckedState) binding.executePendingBindings() - - // 反向联动主列表项(勾选子项时自动勾选父项) - if (newCheckedState) { - val recyclerView = itemView.parent as? RecyclerView ?: return@setOnClickListener - val parentBean = recyclerView.tag as? GjjManifest ?: return@setOnClickListener - parentBean.checked.set(true) - } } } } diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestViewHolder.kt index 9ab035a..c71a06b 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestViewHolder.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpManifestViewHolder.kt @@ -25,10 +25,7 @@ class IntImpManifestViewHolder(view: View) : binding.ivIcon.setOnClickListener { val newCheckedState = !bean.checked.get() bean.checked.set(newCheckedState) - // 联动子列表选中状态 - bean.haWbList?.forEach { sub -> sub.checked.set(newCheckedState) } binding.executePendingBindings() - binding.rvSub.adapter?.notifyDataSetChanged() } // 整卡点击 - 跳转详情页 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 bd64219..a5f4ae0 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 @@ -9,6 +9,7 @@ import com.lukouguoji.gjj.activity.GjjManifestAddActivity import com.lukouguoji.gjj.activity.IntImpManifestSubEditActivity import com.lukouguoji.gjj.holder.IntImpManifestViewHolder import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.GjjHaWb import com.lukouguoji.module_base.bean.GjjManifest import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.ConstantEvent @@ -121,18 +122,6 @@ class IntImpManifestViewModel : BasePageViewModel() { // ========== 分单管理模式 ========== val isSubManagementMode = MutableLiveData(false) - init { - // 监听全选状态,自动更新所有列表项(联动子列表) - isAllChecked.observeForever { checked -> - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return@observeForever - list.forEach { - it.checked.set(checked) - it.haWbList?.forEach { sub -> sub.checked.set(checked) } - } - pageModel.rv?.commonAdapter()?.notifyDataSetChanged() - } - } - // ========== 适配器配置 ========== val itemViewHolder = IntImpManifestViewHolder::class.java val itemLayoutId = R.layout.item_int_imp_manifest @@ -312,7 +301,7 @@ class IntImpManifestViewModel : BasePageViewModel() { message = "确定要删除运单号 ${bean.getWaybillNo()} 的舱单吗?", title = "提示" ) { - doDeleteByIds(listOf(bean.mfId)) + doDelete(listOf(bean), emptyList()) }.show() } @@ -321,37 +310,67 @@ class IntImpManifestViewModel : BasePageViewModel() { */ fun onDeleteClick() { val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - val selectedItems = list.filter { it.isSelected } - if (selectedItems.isEmpty()) { + val selectedManifests = list.filter { it.isSelected } + val selectedHawbs = list.flatMap { it.haWbList?.filter { hawb -> hawb.isSelected } ?: emptyList() } + + if (selectedManifests.isEmpty() && selectedHawbs.isEmpty()) { showToast("请选择要删除的记录") return } + // 构建确认提示信息 + val msgParts = mutableListOf() + if (selectedManifests.isNotEmpty()) { + msgParts.add("${selectedManifests.size} 条主单") + } + if (selectedHawbs.isNotEmpty()) { + msgParts.add("${selectedHawbs.size} 条分单") + } + ConfirmDialogModel( - message = "确定要删除选中的 ${selectedItems.size} 条舱单吗?", + message = "确定要删除选中的 ${msgParts.joinToString("和")} 吗?", title = "批量删除确认" ) { - doDeleteByIds(selectedItems.map { it.mfId }) + doDelete(selectedManifests, selectedHawbs) }.show() } /** - * 执行批量删除(统一接口,请求体为 mfId 数组) + * 执行删除:先删分单,再删主单(串行执行) */ - private fun doDeleteByIds(mfIds: List) { - launchLoadingCollect({ NetApply.api.gjjManifestDeleteBatch(mfIds.toRequestBody()) }) { - onSuccess = { - if (it.verifySuccess()) { - showToast("删除成功") - isAllChecked.value = false - viewModelScope.launch { - FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + private fun doDelete(manifests: List, hawbs: List) { + viewModelScope.launch { + try { + showLoading() + + // 第一步:删除分单(如果有选中的分单) + if (hawbs.isNotEmpty()) { + val hawbResult = NetApply.api.intImpManifestDeleteHawb(hawbs.toRequestBody()) + if (!hawbResult.verifySuccess()) { + showToast(hawbResult.msg.noNull("分单删除失败")) + refresh() + return@launch } - refresh() - } else { - showToast(it.msg.noNull("删除失败")) } + + // 第二步:删除主单(分单删除成功后才执行) + if (manifests.isNotEmpty()) { + val manifestResult = NetApply.api.intImpManifestDeleteManifest(manifests.toRequestBody()) + if (!manifestResult.verifySuccess()) { + showToast(manifestResult.msg.noNull("分单已删除,但主单删除失败")) + refresh() + return@launch + } + } + + showToast("删除成功") + isAllChecked.value = false + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } catch (e: Exception) { + showToast("删除失败:${e.message}") + } finally { + dismissLoading() } } }