From 0f1dbe4e059525a1c4482d980130d705fe241ab2 Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Wed, 21 Jan 2026 11:37:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E9=99=85=E5=87=BA=E6=B8=AF=20?= =?UTF-8?q?=E5=87=BA=E6=B8=AF=E7=BB=84=E8=A3=85=20=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_base/bean/GjcUldUseBean.kt | 26 +- .../holder/IntExpAssembleItemViewHolder.kt | 49 ++ .../gjc/holder/IntExpAssembleSubViewHolder.kt | 21 + .../gjc/viewModel/IntExpAssembleViewModel.kt | 49 +- .../res/layout/activity_int_exp_assemble.xml | 2 + .../main/res/layout/item_int_exp_assemble.xml | 499 ++++++++++++++++++ .../res/layout/item_int_exp_assemble_sub.xml | 116 ++++ 7 files changed, 746 insertions(+), 16 deletions(-) create mode 100644 module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleItemViewHolder.kt create mode 100644 module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleSubViewHolder.kt create mode 100644 module_gjc/src/main/res/layout/item_int_exp_assemble.xml create mode 100644 module_gjc/src/main/res/layout/item_int_exp_assemble_sub.xml diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt index 963d296..fdb99ed 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt @@ -56,18 +56,40 @@ class GjcUldUseBean { var piClose: String = "" // 探板/收口 var piCloseSize: String = "" // 探板尺寸(CM) var location: String = "" // 位置 - var pieces: String = "" // 件数 + var pieces: String = "" // 件数(字符串格式) var remark: String = "" // 备注 var checkFlag: String = "" // 检查标记 var emptyUld: String = "" // 空ULD + var loadArea: String = "" // 组装区 + var pc: Long = 0 // 组装件数 + // ========== 出港组装页面扩展字段 ========== - var isExpanded: Boolean = false // 展开状态 + var isExpanded: Boolean = false // 展开状态(旧版保留) + @Transient val checked: ObservableBoolean = ObservableBoolean(false) // 选中状态(Observable) + @Transient + val showMore: ObservableBoolean = ObservableBoolean(false) // 展开状态(Observable) + @Transient + val isLoading: ObservableBoolean = ObservableBoolean(false) // 子列表加载中状态 + @Transient + var waybillDetailsLoaded: Boolean = false // 子列表是否已加载过(用于区分"未加载"和"加载后为空") var waybillDetails: MutableList? = null // 运单明细缓存 + // 子列表是否有数据 + val hasWaybillDetails: Boolean + get() = waybillDetails != null && waybillDetails!!.isNotEmpty() + + // 是否显示"暂无数据"(已加载但无数据) + val showEmptyView: Boolean + get() = waybillDetailsLoaded && !hasWaybillDetails + // 兼容原有代码的isSelected属性 var isSelected: Boolean get() = checked.get() set(value) = checked.set(value) + + // 复磅状态文本 + val wtStatusText: String + get() = if (wtDate.isNotEmpty()) "已复磅" else "未复磅" } diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleItemViewHolder.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleItemViewHolder.kt new file mode 100644 index 0000000..4bdd3fe --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleItemViewHolder.kt @@ -0,0 +1,49 @@ +package com.lukouguoji.gjc.holder + +import android.view.View +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ItemIntExpAssembleBinding +import com.lukouguoji.module_base.adapter.setCommonAdapter +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GjcUldUseBean +import com.lukouguoji.module_base.ktx.refresh + +/** + * 国际出港-出港组装 列表项ViewHolder + * 参考出港运抵页面的实现 + */ +class IntExpAssembleItemViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item) ?: return + binding.bean = bean + binding.position = position + binding.executePendingBindings() + + // 添加图标点击事件 - 切换选择状态 + binding.ivIcon.setOnClickListener { + // 反转checked状态 + bean.checked.set(!bean.checked.get()) + + // 立即更新UI(图片自动切换) + binding.executePendingBindings() + } + + // ========== 展开按钮点击事件 ========== + // 通过回调通知ViewModel处理展开逻辑(需要加载数据) + binding.ivShow.setOnClickListener { + clickListener?.onItemClick(position, 1000) // type=1000表示展开操作 + } + + // ========== 初始化子列表 RecyclerView ========== + setCommonAdapter( + binding.rvSub, + IntExpAssembleSubViewHolder::class.java, + R.layout.item_int_exp_assemble_sub + ) + + // 刷新子列表数据 + binding.rvSub.refresh(bean.waybillDetails ?: emptyList()) + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleSubViewHolder.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleSubViewHolder.kt new file mode 100644 index 0000000..09385c2 --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/IntExpAssembleSubViewHolder.kt @@ -0,0 +1,21 @@ +package com.lukouguoji.gjc.holder + +import android.view.View +import com.lukouguoji.gjc.databinding.ItemIntExpAssembleSubBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GjcWarehouse + +/** + * 国际出港-出港组装 子列表ViewHolder + * 显示运单明细信息 + */ +class IntExpAssembleSubViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item) ?: return + binding.bean = bean + binding.position = position + 1 // 序号从1开始 + binding.executePendingBindings() + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleViewModel.kt index ed76da4..5729314 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.alibaba.android.arouter.launcher.ARouter import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.holder.IntExpAssembleViewHolder +import com.lukouguoji.gjc.holder.IntExpAssembleItemViewHolder import com.lukouguoji.module_base.base.BasePageViewModel import com.lukouguoji.module_base.bean.GjcUldUseBean import com.lukouguoji.module_base.http.net.NetApply @@ -20,7 +20,7 @@ import com.lukouguoji.module_base.ktx.verifyNullOrEmpty import com.lukouguoji.module_base.router.ARouterConstants import dev.utils.app.info.KeyValue import dev.utils.common.DateUtils -import com.lukouguoji.module_base.ktx.formatDate +import com.lukouguoji.module_base.ktx.formatDate import kotlinx.coroutines.launch /** @@ -45,8 +45,8 @@ class IntExpAssembleViewModel : BasePageViewModel() { val assemblerList = MutableLiveData>(emptyList()) // 组装人列表 // ========== 适配器配置 ========== - val itemViewHolder = IntExpAssembleViewHolder::class.java - val itemLayoutId = R.layout.item_int_exp_assemble_uld + val itemViewHolder = IntExpAssembleItemViewHolder::class.java + val itemLayoutId = R.layout.item_int_exp_assemble // ========== 底部统计 ========== val totalCount = MutableLiveData("0") // 合计票数 @@ -77,33 +77,54 @@ class IntExpAssembleViewModel : BasePageViewModel() { /** * 切换展开/收起状态 + * 首次展开时加载运单明细数据 */ fun toggleExpand(position: Int) { val bean = pageModel.rv?.commonAdapter()?.getItem(position) as? GjcUldUseBean ?: return - bean.isExpanded = !bean.isExpanded + val isCurrentlyExpanded = bean.showMore.get() - if (bean.isExpanded && bean.waybillDetails == null) { - // 首次展开,加载运单明细 - loadWaybillDetails(position, bean) + if (isCurrentlyExpanded) { + // 当前是展开状态,收起 + bean.showMore.set(false) } else { - // 已有数据,直接刷新item显示/隐藏 - pageModel.rv?.commonAdapter()?.notifyItemChanged(position) + // 当前是收起状态,展开 + bean.showMore.set(true) + // 如果未加载过数据,则加载 + if (!bean.waybillDetailsLoaded) { + loadWaybillDetails(position, bean) + } } } /** * 加载运单明细 + * 使用接口: /IntExpAssemble/queryAssembledByUld */ private fun loadWaybillDetails(position: Int, bean: GjcUldUseBean) { - val params = mapOf("useId" to bean.useId).toRequestBody() + // 设置加载中状态 + bean.isLoading.set(true) + pageModel.rv?.commonAdapter()?.notifyItemChanged(position) - launchCollect({ NetApply.api.getIntExpAssembleWaybillDetails(params) }) { + // 构建请求参数 - 传递完整的GjcUldUseBean信息 + val params = mapOf( + "useId" to bean.useId, + "uld" to bean.uld, + "fdate" to bean.fdate, + "fno" to bean.fno + ).toRequestBody() + + launchCollect({ NetApply.api.getAssembledWaybillsByUld(params) }) { onSuccess = { result -> - bean.waybillDetails = result.data ?: mutableListOf() + bean.waybillDetails = result.data?.toMutableList() + bean.waybillDetailsLoaded = true + bean.isLoading.set(false) pageModel.rv?.commonAdapter()?.notifyItemChanged(position) } onFailed = { _, msg -> - bean.isExpanded = false // 加载失败,恢复展开状态 + bean.waybillDetailsLoaded = true // 标记为已加载(即使失败也显示暂无数据) + bean.waybillDetails = mutableListOf() // 设置空列表 + bean.isLoading.set(false) + pageModel.rv?.commonAdapter()?.notifyItemChanged(position) showToast(msg) } } diff --git a/module_gjc/src/main/res/layout/activity_int_exp_assemble.xml b/module_gjc/src/main/res/layout/activity_int_exp_assemble.xml index c938cb9..5d85182 100644 --- a/module_gjc/src/main/res/layout/activity_int_exp_assemble.xml +++ b/module_gjc/src/main/res/layout/activity_int_exp_assemble.xml @@ -132,6 +132,8 @@ android:layout_height="match_parent" android:overScrollMode="never" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + itemLayoutId="@{viewModel.itemLayoutId}" + viewHolder="@{viewModel.itemViewHolder}" tools:itemCount="3" tools:listitem="@layout/item_int_exp_assemble_uld" /> diff --git a/module_gjc/src/main/res/layout/item_int_exp_assemble.xml b/module_gjc/src/main/res/layout/item_int_exp_assemble.xml new file mode 100644 index 0000000..69ed676 --- /dev/null +++ b/module_gjc/src/main/res/layout/item_int_exp_assemble.xml @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/layout/item_int_exp_assemble_sub.xml b/module_gjc/src/main/res/layout/item_int_exp_assemble_sub.xml new file mode 100644 index 0000000..8e04e9b --- /dev/null +++ b/module_gjc/src/main/res/layout/item_int_exp_assemble_sub.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +