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}" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+