diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjLoadingUld.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjLoadingUld.kt new file mode 100644 index 0000000..0352e42 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjLoadingUld.kt @@ -0,0 +1,36 @@ +package com.lukouguoji.module_base.bean + +import androidx.databinding.ObservableBoolean +import com.lukouguoji.module_base.interfaces.ICheck +import java.io.Serializable + +/** + * 国际进港装机单 ULD 主单 Bean + * 对应接口:/IntImpManifest/pageQueryAir 返回的列表项(按 ULD 分组,manifestList 为关联运单) + */ +data class GjjLoadingUld( + var uld: String? = null, // ULD 编号 + var flight: String? = null, // 航班信息 + var totalPc: Long? = null, // 总件数 + var totalWeight: Double? = null, // 总重量 + var manifestList: List? = null, // 关联运单列表 + + // 展开/收起状态 + @Transient + val showMore: ObservableBoolean = ObservableBoolean(false), + + // 选中状态 + @Transient + val checked: ObservableBoolean = ObservableBoolean(false) +) : Serializable, ICheck { + + override fun getCheckObservable(): ObservableBoolean = checked + + var isSelected: Boolean + get() = checked.get() + set(value) = checked.set(value) + + /** 总重量显示(取整) */ + val totalWeightText: String + get() = ((totalWeight ?: 0.0).toInt()).toString() +} 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 310e4ac..74fca48 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 @@ -56,6 +56,7 @@ import com.lukouguoji.module_base.bean.IntImpAccidentVisaBean import com.lukouguoji.module_base.bean.IntImpPickUpDLVBean import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean import com.lukouguoji.module_base.bean.IntImpQueryBean +import com.lukouguoji.module_base.bean.GjjLoadingUld import com.lukouguoji.module_base.bean.GjjManifest import com.lukouguoji.module_base.bean.GjjManifestBean import com.lukouguoji.module_base.bean.GjjPackTypeBean @@ -1956,10 +1957,10 @@ interface Api { suspend fun getMaWbMinusHaWb(@Body data: RequestBody): BaseResultBean /** - * 国际进港舱单-分拣理货(装机单)-分页查询 + * 国际进港舱单-分拣理货(装机单)-分页查询(按 ULD 分组,manifestList 为关联运单) */ @POST("IntImpManifest/pageQueryAir") - suspend fun getIntImpLoadingList(@Body data: RequestBody): PageInfo + suspend fun getIntImpLoadingList(@Body data: RequestBody): PageInfo /** * 国际进港舱单-分拣理货(装机单)-分页合计 diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt index c78cb6a..e19eca4 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt @@ -10,13 +10,11 @@ import com.lukouguoji.gjj.dialog.IntImpInStorageDialogModel import com.lukouguoji.gjj.dialog.IntImpModifyStorageDialogModel import com.lukouguoji.gjj.viewModel.IntImpLoadingListViewModel import com.lukouguoji.module_base.base.BaseBindingActivity -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.impl.FlowBus import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.ktx.addOnItemClickListener -import com.lukouguoji.module_base.ktx.commonAdapter import com.lukouguoji.module_base.ktx.showToast import com.lukouguoji.module_base.router.ARouterConstants @@ -43,7 +41,7 @@ class IntImpLoadingListActivity : // 监听刷新事件 FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } - + FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { viewModel.refresh() } @@ -78,8 +76,7 @@ class IntImpLoadingListActivity : * 显示入库操作对话框 */ fun showInStorageDialog() { - val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return - val selectedItems = list.filterIsInstance().filter { it.isSelected } + val selectedItems = viewModel.getSelectedManifests() if (selectedItems.isEmpty()) { showToast("请选择要入库的记录") @@ -97,8 +94,7 @@ class IntImpLoadingListActivity : * 显示修改库位对话框 */ fun showModifyStorageDialog() { - val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return - val selectedItems = list.filterIsInstance().filter { it.isSelected } + val selectedItems = viewModel.getSelectedManifests() if (selectedItems.isEmpty()) { showToast("请选择要修改库位的记录") diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListSubViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListSubViewHolder.kt new file mode 100644 index 0000000..0253095 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListSubViewHolder.kt @@ -0,0 +1,26 @@ +package com.lukouguoji.gjj.holder + +import android.view.View +import com.lukouguoji.gjj.activity.IntImpLoadingListEditActivity +import com.lukouguoji.gjj.databinding.ItemIntImpLoadingListSubBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GjjManifest + +/** + * 国际进港装机单 关联运单(子单) ViewHolder + */ +class IntImpLoadingListSubViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item) ?: return + binding.bean = bean + binding.position = position + 1 + binding.executePendingBindings() + + // 点击运单行进入装机单编辑 + binding.llRow.setOnClickListener { + IntImpLoadingListEditActivity.start(itemView.context, bean) + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt index 45d5c17..b220c50 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt @@ -1,17 +1,20 @@ package com.lukouguoji.gjj.holder import android.view.View +import com.lukouguoji.gjj.R import com.lukouguoji.gjj.databinding.ItemIntImpLoadingListBinding +import com.lukouguoji.module_base.adapter.setCommonAdapter import com.lukouguoji.module_base.base.BaseViewHolder -import com.lukouguoji.module_base.common.ConstantEvent -import com.lukouguoji.module_base.impl.FlowBus -import com.lukouguoji.module_base.bean.GjjManifest +import com.lukouguoji.module_base.bean.GjjLoadingUld +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.ktx.refresh /** - * 国际进港装机单 ViewHolder + * 国际进港装机单 ULD 主单 ViewHolder */ class IntImpLoadingListViewHolder(view: View) : - BaseViewHolder(view) { + BaseViewHolder(view) { override fun onBind(item: Any?, position: Int) { val bean = getItemBean(item) ?: return @@ -26,10 +29,35 @@ class IntImpLoadingListViewHolder(view: View) : binding.executePendingBindings() } - // 侧滑菜单 - 编辑按钮 - binding.btnEdit.setOnClickListener { - binding.swipeMenu.quickClose() - clickListener?.onItemClick(position, 2000) + // 展开/收起关联运单 + binding.ivShow.setOnClickListener { + bean.showMore.set(!bean.showMore.get()) + } + + // 初始化子列表 RecyclerView + setCommonAdapter( + binding.rvSub, + IntImpLoadingListSubViewHolder::class.java, + R.layout.item_int_imp_loading_list_sub + ) + + // 刷新子列表数据 + val subList = bean.manifestList ?: emptyList() + binding.rvSub.refresh(subList) + updateSubListVisibility(subList.isNotEmpty()) + } + + private fun updateSubListVisibility(hasData: Boolean) { + if (hasData) { + binding.llHeader.visibility = View.VISIBLE + binding.dividerHeader.visibility = View.VISIBLE + binding.rvSub.visibility = View.VISIBLE + binding.tvEmpty.visibility = View.GONE + } else { + binding.llHeader.visibility = View.GONE + binding.dividerHeader.visibility = View.GONE + binding.rvSub.visibility = View.GONE + binding.tvEmpty.visibility = View.VISIBLE } } } diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt index c0e2253..c687be8 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import com.lukouguoji.gjj.R import com.lukouguoji.gjj.holder.IntImpLoadingListViewHolder import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.GjjLoadingUld import com.lukouguoji.module_base.bean.GjjManifest import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.ConstantEvent @@ -109,15 +110,23 @@ class IntImpLoadingListViewModel : BasePageViewModel(), IOnItemClickListener { // ========== 全选状态 ========== val isAllChecked = MutableLiveData(false) - - fun onItemCheckChanged() { - updateCheckAllStatus() - } - - fun updateCheckAllStatus() { - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - isAllChecked.value = list.isNotEmpty() && list.all { it.checked.get() } - } + + fun onItemCheckChanged() { + updateCheckAllStatus() + } + + fun updateCheckAllStatus() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + isAllChecked.value = list.isNotEmpty() && list.all { it.checked.get() } + } + + /** + * 获取选中 ULD 下的全部运单(供修改库位/入库使用) + */ + fun getSelectedManifests(): List { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return emptyList() + return list.filter { it.checked.get() }.flatMap { it.manifestList ?: emptyList() } + } // ========== 适配器配置 ========== val itemViewHolder = IntImpLoadingListViewHolder::class.java @@ -191,7 +200,7 @@ class IntImpLoadingListViewModel : BasePageViewModel(), IOnItemClickListener { * 全选按钮点击(切换全选状态) */ fun checkAllClick() { - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return // 切换全选状态 val shouldCheckAll = !isAllChecked.value!! @@ -280,17 +289,9 @@ class IntImpLoadingListViewModel : BasePageViewModel(), IOnItemClickListener { } /** - * 列表项点击回调(侧滑菜单) + * 列表项点击回调(运单编辑已改为在子列表 ViewHolder 中直接跳转) */ override fun onItemClick(position: Int, type: Int) { - when (type) { - 2000 -> { - // 编辑操作 - val list = pageModel.rv?.commonAdapter()?.items as? List ?: return - val bean = list.getOrNull(position) ?: return - com.lukouguoji.gjj.activity.IntImpLoadingListEditActivity.start(getTopActivity(), bean) - } - } } /** 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 65ee829..c2dd7b6 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 @@ -509,7 +509,10 @@ class IntImpManifestViewModel : BasePageViewModel() { launchLoadingCollect({ NetApply.api.getIntImpLoadingList(queryParams) }) { onSuccess = { result -> - val tallyRecord = result.list?.firstOrNull() + // 装机单接口已按 ULD 分组,运单记录在 manifestList 中 + val tallyRecord = result.list + ?.flatMap { it.manifestList ?: emptyList() } + ?.let { list -> list.firstOrNull { it.wbNo == selectedItem.wbNo || it.getWaybillNo() == selectedItem.wbNo } ?: list.firstOrNull() } showModifyStorageDialog( selectedItems = selectedItems, currentLocationId = tallyRecord?.locationTallyId?.takeIf { it > 0 }?.toString() ?: "", diff --git a/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml b/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml index f0f6fb7..c132f06 100644 --- a/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml +++ b/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml @@ -155,7 +155,7 @@ - + + android:textSize="18sp" + android:visibility="gone" /> - + + android:textSize="18sp" + android:visibility="gone" /> diff --git a/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml b/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml index 15d1e0a..be79e04 100644 --- a/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml +++ b/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml @@ -8,55 +8,56 @@ + type="com.lukouguoji.module_base.bean.GjjLoadingUld" /> - + android:layout_marginTop="10dp" + android:orientation="vertical"> - + + android:orientation="vertical"> - - - - + + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingHorizontal="10dp" + android:paddingVertical="20dp"> - + + + + - + - + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - @@ -302,23 +165,108 @@ + + + - - + + - + + android:id="@+id/tv_empty" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:paddingVertical="15dp" + android:text="暂无运单数据" + android:textColor="@color/text_gray" + android:textSize="14sp" + android:visibility="gone" /> - + + - + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/item_int_imp_loading_list_sub.xml b/module_gjj/src/main/res/layout/item_int_imp_loading_list_sub.xml new file mode 100644 index 0000000..c036129 --- /dev/null +++ b/module_gjj/src/main/res/layout/item_int_imp_loading_list_sub.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +