From f61302a1f68052daae77146b8d979917148b4b97 Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Fri, 13 Mar 2026 10:32:10 +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=E5=88=86=E5=8D=95=E6=96=B0=E5=A2=9E=E4=B8=8E?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=A1=B5=E9=9D=A2?= 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 | 7 +- app/src/main/AndroidManifest.xml | 7 + .../lukouguoji/module_base/http/net/Api.kt | 18 ++ .../activity/IntImpManifestSubEditActivity.kt | 59 ++++++ .../IntImpManifestSubEditViewModel.kt | 144 ++++++++++++++ .../gjj/viewModel/IntImpManifestViewModel.kt | 63 +++++- .../res/layout/activity_int_imp_manifest.xml | 37 +++- .../activity_int_imp_manifest_sub_edit.xml | 180 ++++++++++++++++++ 8 files changed, 510 insertions(+), 5 deletions(-) create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpManifestSubEditActivity.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestSubEditViewModel.kt create mode 100644 module_gjj/src/main/res/layout/activity_int_imp_manifest_sub_edit.xml diff --git a/.claude/settings.local.json b/.claude/settings.local.json index c9678aa..da51d93 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -77,7 +77,12 @@ "Read(//tmp/**)", "mcp__apifox__read_project_oas_3gn3lx", "mcp__apifox__read_project_oas_ref_resources_3gn3lx", - "mcp__apifox__refresh_project_oas_3gn3lx" + "mcp__apifox__refresh_project_oas_3gn3lx", + "Bash(cp \"/var/folders/qz/qk20ny650h1fhmxrx46gdfhr0000gn/T/images/Warp 2026-03-13 09.54.13.tiff\" /tmp/screenshot.png)", + "Read(//private/var/folders/qz/qk20ny650h1fhmxrx46gdfhr0000gn/T/images/**)", + "mcp__apifox__read_project_oas_2s2uhx", + "mcp__apifox__read_project_oas_ref_resources_2s2uhx", + "mcp__apifox__refresh_project_oas_2s2uhx" ], "deny": [], "ask": [] diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 955b3ce..8448698 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -425,6 +425,13 @@ android:exported="false" android:screenOrientation="userLandscape" /> + + + > + /** + * 国际进港舱单-新增分单 + */ + @POST("IntImpManifest/addHaWb") + suspend fun intImpManifestAddHaWb(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港舱单-修改分单 + */ + @POST("IntImpManifest/modifyHaWb") + suspend fun intImpManifestModifyHaWb(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港舱单-获取主单减去分单的件数重量 + */ + @POST("IntImpManifest/getMaWbMinusHaWb") + suspend fun getMaWbMinusHaWb(@Body data: RequestBody): BaseResultBean + /** * 国际进港舱单-分拣理货(装机单)-分页查询 */ 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 new file mode 100644 index 0000000..cfae032 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpManifestSubEditActivity.kt @@ -0,0 +1,59 @@ +package com.lukouguoji.gjj.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.databinding.ActivityIntImpManifestSubEditBinding +import com.lukouguoji.gjj.viewModel.IntImpManifestSubEditViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +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.DetailsPageType + +class IntImpManifestSubEditActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_int_imp_manifest_sub_edit + + override fun viewModelClass() = IntImpManifestSubEditViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.viewModel = viewModel + viewModel.initOnCreated(intent) + + val title = when (viewModel.pageType.value) { + DetailsPageType.Modify -> "分单编辑" + else -> "分单新增" + } + setBackArrow(title) + } + + companion object { + /** + * 新增分单 + */ + @JvmStatic + fun startForAdd(context: Context, manifest: GjjManifest) { + context.startActivity( + Intent(context, IntImpManifestSubEditActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Add.name) + .putExtra(Constant.Key.BEAN, manifest) + ) + } + + /** + * 修改分单 + */ + @JvmStatic + fun startForModify(context: Context, manifest: GjjManifest, haWb: GjjHaWb) { + context.startActivity( + Intent(context, IntImpManifestSubEditActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Modify.name) + .putExtra(Constant.Key.BEAN, manifest) + .putExtra("haWb", haWb) + ) + } + } +} 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 new file mode 100644 index 0000000..8e3cfa0 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestSubEditViewModel.kt @@ -0,0 +1,144 @@ +package com.lukouguoji.gjj.viewModel + +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.lukouguoji.module_base.base.BaseViewModel +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 +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 +import com.lukouguoji.module_base.ktx.toRequestBody +import kotlinx.coroutines.launch + +/** + * 国际进港舱单-分单编辑 ViewModel + */ +class IntImpManifestSubEditViewModel : BaseViewModel() { + + // 页面类型 + val pageType = MutableLiveData(DetailsPageType.Add) + + // 分单ID(编辑时使用) + var hawbId: Long = 0 + + // 主单ID + var mfId: Long = 0 + + // 运单号前缀和编号(从主单获取,保存时需传给接口) + var prefix: String = "" + var no: String = "" + + // 表单字段 + val waybillNo = MutableLiveData("") // 运单号(只读) + val mainSubCheck = MutableLiveData("") // 主分校验(只读) + val subNo = MutableLiveData("") // 分单号 + val pc = MutableLiveData("") // 件数 + val weight = MutableLiveData("") // 重量 + val goodsCn = MutableLiveData("") // 品名(中) + + /** + * 初始化(从Intent获取参数) + */ + fun initOnCreated(intent: Intent) { + pageType.value = DetailsPageType.valueOf( + intent.getStringExtra(Constant.Key.PAGE_TYPE) ?: DetailsPageType.Add.name + ) + + // 获取主单信息 + val manifest = intent.getSerializableExtra(Constant.Key.BEAN) as? GjjManifest + if (manifest != null) { + mfId = manifest.mfId + prefix = manifest.prefix + no = manifest.no + waybillNo.value = manifest.getWaybillNo() + } + + // 编辑模式:回填分单数据 + if (pageType.value == DetailsPageType.Modify) { + val haWb = intent.getSerializableExtra("haWb") as? GjjHaWb + if (haWb != null) { + hawbId = haWb.hawbId + 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 + } + } + + // 获取主分校验数据 + loadMainSubCheck() + } + + /** + * 获取主单减去分单的件数重量 + */ + private fun loadMainSubCheck() { + if (mfId == 0L) return + + 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 onSaveClick() { + val params = mutableMapOf( + "mfId" to mfId, + "prefix" to prefix, + "no" to no, + "hno" to subNo.value, + "pc" to pc.value?.toLongOrNull(), + "weight" to weight.value?.toDoubleOrNull(), + "goodsCn" to goodsCn.value, + "goods" to goodsCn.value + ) + + if (pageType.value == DetailsPageType.Modify) { + params["hawbId"] = hawbId + } + + launchLoadingCollect({ + if (pageType.value == DetailsPageType.Modify) { + NetApply.api.intImpManifestModifyHaWb(params.toRequestBody()) + } else { + NetApply.api.intImpManifestAddHaWb(params.toRequestBody()) + } + }) { + onSuccess = { + if (it.verifySuccess()) { + val msg = if (pageType.value == DetailsPageType.Modify) "修改成功" else "新增成功" + showToast(msg) + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + getTopActivity().finish() + } else { + showToast(it.msg.noNull("保存失败")) + } + } + } + } + + /** + * 取消 + */ + fun onCancelClick() { + getTopActivity().finish() + } +} 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 a30391d..9433b7f 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 @@ -6,6 +6,7 @@ import com.lukouguoji.gjj.R import dev.utils.common.DateUtils import com.lukouguoji.module_base.ktx.formatDate 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.GjjManifest @@ -117,6 +118,9 @@ class IntImpManifestViewModel : BasePageViewModel() { // ========== 展开/收起 ========== val isAllExpanded = MutableLiveData(false) + // ========== 分单管理模式 ========== + val isSubManagementMode = MutableLiveData(false) + init { // 监听全选状态,自动更新所有列表项(联动子列表) isAllChecked.observeForever { checked -> @@ -342,10 +346,65 @@ class IntImpManifestViewModel : BasePageViewModel() { } /** - * 分单管理(暂不实现) + * 分单管理按钮点击 - 进入分单管理模式 */ fun subManagementClick() { - showToast("分单管理功能开发中") + isSubManagementMode.value = true + } + + /** + * 分单管理模式 - 返回按钮点击 + */ + fun subManagementBackClick() { + isSubManagementMode.value = false + } + + /** + * 新增分单 - 选中一个主单后打开新增页面 + */ + fun addSubWaybillClick() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择一个主单") + return + } + if (selectedItems.size > 1) { + showToast("只能选择一个主单") + return + } + + IntImpManifestSubEditActivity.startForAdd(getTopActivity(), selectedItems[0]) + } + + /** + * 修改分单 - 选中一个分单后打开编辑页面 + */ + fun modifySubWaybillClick() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + + // 收集所有已选中的分单及其所属主单 + val selectedPairs = mutableListOf>() + list.forEach { manifest -> + manifest.haWbList?.forEach { haWb -> + if (haWb.isSelected) { + selectedPairs.add(manifest to haWb) + } + } + } + + if (selectedPairs.isEmpty()) { + showToast("请选择一个分单") + return + } + if (selectedPairs.size > 1) { + showToast("只能选择一个分单") + return + } + + val (parentManifest, selectedHaWb) = selectedPairs[0] + IntImpManifestSubEditActivity.startForModify(getTopActivity(), parentManifest, selectedHaWb) } /** diff --git a/module_gjj/src/main/res/layout/activity_int_imp_manifest.xml b/module_gjj/src/main/res/layout/activity_int_imp_manifest.xml index 81efece..5dc05c5 100644 --- a/module_gjj/src/main/res/layout/activity_int_imp_manifest.xml +++ b/module_gjj/src/main/res/layout/activity_int_imp_manifest.xml @@ -6,6 +6,7 @@ + + + + + + + + - + + android:text="分单管理" + android:visibility="@{viewModel.isSubManagementMode ? View.GONE : View.VISIBLE}" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +