From f39127436a3a105356966b88eaaefdaa36d5afc1 Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Thu, 17 Sep 2026 11:49:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E9=99=85=E5=87=BA=E6=B8=AF?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E7=BB=84=E8=A3=85=E6=9D=BF=E5=9E=8B=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=94=B9=E4=B8=BA=E6=8E=A7=E4=BB=B6=E4=B8=8B=E6=96=B9?= =?UTF-8?q?=E5=B1=95=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 板型由底部弹框选择改为锚定在输入框正下方的 ListPopupWindow, 复用相邻 BUP Spinner 的弹层背景与列表项布局,外观保持一致, 且不影响手动输入。 板型数据源的承运人参数改由 ULD 编号触发:选中运单不再重载, 改为 ULD 信息查询成功后取 ULD 编号后两位作为 carrier 重新加载。 Co-Authored-By: Claude Opus 5 --- .../assemble/IntExpAssembleStartActivity.kt | 54 ++++++++++++++++++- .../viewModel/IntExpAssembleStartViewModel.kt | 35 ++++-------- .../activity_int_exp_assemble_start.xml | 2 +- 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt index a69fe51..8d279b4 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt @@ -5,6 +5,10 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.ArrayAdapter +import androidx.appcompat.widget.AppCompatSpinner +import androidx.appcompat.widget.ListPopupWindow import androidx.recyclerview.widget.LinearLayoutManager import com.alibaba.android.arouter.facade.annotation.Route import com.lukouguoji.gjc.R @@ -19,6 +23,7 @@ import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.interfaces.IOnItemClickListener import com.lukouguoji.module_base.ktx.addOnItemClickListener import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter +import com.lukouguoji.module_base.ktx.showToast import com.lukouguoji.module_base.router.ARouterConstants /** @@ -29,6 +34,7 @@ class IntExpAssembleStartActivity : BaseBindingActivity(), IOnItemClickListener { + private var boardTypePopup: ListPopupWindow? = null private var assembleInfoAdapter: CommonAdapter? = null private var assemblePositionAdapter: CommonAdapter? = null private var waybillAdapter: CommonAdapter? = null @@ -72,11 +78,12 @@ class IntExpAssembleStartActivity : binding.impCodeInput.et.setUpperCaseAlphanumericFilter() // 板型:手动输入 + 下拉选择组合框。箭头复用 Spinner 同款背景绘制(同资源、同尺寸、同边距), - // 图标位不放图片,仅作为覆盖在箭头上的透明点击区域(点击事件由布局 setOnIconClickListener 绑定) + // 图标位不放图片,仅作为覆盖在箭头上的透明点击区域 binding.boardTypeInput.apply { ll.setBackgroundResource(com.lukouguoji.module_base.R.drawable.bg_data_layout_new_dropdown) iv.setImageDrawable(null) iv.visibility = View.VISIBLE + iv.setOnClickListener { showBoardTypeDropdown() } } // 初始化列表 @@ -106,6 +113,51 @@ class IntExpAssembleStartActivity : handleEditModeIntent() } + /** + * 板型下拉:锚定在板型输入框正下方展开(外观与相邻 BUP 的 Spinner 下拉一致),选中后回填,仍可手动输入 + */ + private fun showBoardTypeDropdown() { + val list = viewModel.boardTypeList.value ?: emptyList() + if (list.isEmpty()) { + showToast("暂无板型选项,请手动输入") + return + } + + val anchor = binding.boardTypeInput.ll + + // 先收起软键盘,避免下拉被输入法遮挡 + (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager) + ?.hideSoftInputFromWindow(anchor.windowToken, 0) + boardTypePopup?.dismiss() + boardTypePopup = ListPopupWindow(this).apply { + anchorView = anchor + width = anchor.width + isModal = true + // 复用 BUP Spinner 的弹窗背景,保证两者下拉外观完全一致 + (binding.bupFlagInput.spinner as? AppCompatSpinner)?.popupBackground + ?.constantState?.newDrawable()?.mutate() + ?.let { setBackgroundDrawable(it) } + setAdapter( + ArrayAdapter( + this@IntExpAssembleStartActivity, + com.lukouguoji.module_base.R.layout.item_spinner_list, + list.map { it.key } + ) + ) + setOnItemClickListener { _, _, position, _ -> + viewModel.onBoardTypeSelected(position) + dismiss() + } + show() + } + } + + override fun onDestroy() { + boardTypePopup?.dismiss() + boardTypePopup = null + super.onDestroy() + } + /** * 处理修改模式的 Intent 参数 */ diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt index 3fb18d5..2030c83 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt @@ -2,7 +2,6 @@ package com.lukouguoji.gjc.viewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope -import com.alibaba.fastjson.JSONArray import com.lukouguoji.gjc.R import com.lukouguoji.gjc.holder.AssembleInfoViewHolder import com.lukouguoji.gjc.holder.AssemblePositionViewHolder @@ -17,10 +16,8 @@ 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.showToast -import com.lukouguoji.module_base.ktx.toJson import com.lukouguoji.module_base.ktx.toRequestBody import com.lukouguoji.module_base.model.ScanModel -import com.lukouguoji.module_base.util.Common import com.lukouguoji.module_base.util.DictUtils import dev.utils.app.info.KeyValue import kotlinx.coroutines.launch @@ -271,9 +268,6 @@ class IntExpAssembleStartViewModel : BaseViewModel() { assembleWeight = previousAssembleWeight operator = previousOperator // 从operator LiveData获取的值 } - - // 按该运单航班号前两位(承运人)重新加载板型选项,覆盖下拉数据源 - loadBoardTypeList(selectedWaybill.fno.trim().take(2)) } // 刷新列表 @@ -419,33 +413,20 @@ class IntExpAssembleStartViewModel : BaseViewModel() { /** * 加载板型选项列表 - * @param carrier 承运人二字码(待组装运单航班号前两位);进入页面时不传,选中运单后按承运人重新加载并覆盖数据源 + * @param carrier 承运人二字码(ULD 编号后两位);进入页面时不传取全量,ULD 信息查询成功后按承运人重新加载并覆盖数据源 */ fun loadBoardTypeList(carrier: String? = null) { DictUtils.getBoardTypeList(carrier) { boardTypeList.value = it } } /** - * 板型下拉图标点击:弹出选项列表,选中后回填到板型输入框(回填后仍可手动修改) + * 板型下拉选中回调:回填到板型输入框(回填后仍可手动修改) + * 下拉列表由 Activity 以锚定在输入框下方的 ListPopupWindow 弹出(外观与 BUP 的 Spinner 一致) */ - fun onBoardTypeSelectClick() { + fun onBoardTypeSelected(position: Int) { val list = boardTypeList.value ?: emptyList() - if (list.isEmpty()) { - showToast("暂无板型选项,请手动输入") - return - } - val jsonArray = JSONArray.parseArray( - list.map { mapOf("name" to it.key, "code" to it.value) }.toJson(false) - ) - Common.singleSelect( - getTopActivity(), - "选择板型", - jsonArray, - uldInfo.value?.boardType - ) { position, _ -> - uldInfo.value = uldInfo.value?.apply { - boardType = list.getOrNull(position)?.value ?: "" - } + uldInfo.value = uldInfo.value?.apply { + boardType = list.getOrNull(position)?.value ?: "" } } @@ -489,6 +470,10 @@ class IntExpAssembleStartViewModel : BaseViewModel() { if (!uldBean.bupFlag.isNullOrEmpty()) bupFlag = uldBean.bupFlag } + // 按 ULD 编号后两位(承运人二字码)重新加载板型选项,覆盖下拉数据源 + val carrier = uldNo.trim().takeLast(2) + if (carrier.length == 2) loadBoardTypeList(carrier) + // 【新增】从ULD信息提取航班信息 if (uldBean.fno.isNotEmpty() && uldBean.fdate.isNotEmpty()) { assembleFlightNo.value = uldBean.fno diff --git a/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml b/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml index 5876db6..c544a34 100644 --- a/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml +++ b/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml @@ -319,7 +319,6 @@ enable="@{true}" hint='@{"请输入或选择"}' required="@{false}" - setOnIconClickListener="@{(v) -> viewModel.onBoardTypeSelectClick()}" setTextAllCaps="@{true}" title='@{"板型:"}' titleLength="@{5}" @@ -330,6 +329,7 @@ android:layout_weight="1" />