refactor: 国际出港查询筛选改内嵌面板并对齐国际进港交互

- 筛选由XPopup全屏抽屉改为内嵌滑动面板,不再遮挡标题栏
- 有筛选条件时筛选按钮显示红点(hasFilter)
- 航班号锁定大写字母数字、目的港锁定大写字母
- 运单类型走字典接口(type=IO 国际出港),修正原错误的"10"
- 修复PadDataLayoutNew重置后Spinner UI未清空(国际进港同组件一并修复)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 12:25:30 +08:00
parent 084832e4e9
commit 9c4588e47e
8 changed files with 614 additions and 519 deletions

View File

@@ -719,7 +719,7 @@ XxxDialogModel(onConfirm = { refresh() }).show()
|------|------|------|------| |------|------|------|------|
| 底部 | `DIALOG_TYPE_BOTTOM` | 操作选项 | 默认类型 | | 底部 | `DIALOG_TYPE_BOTTOM` | 操作选项 | 默认类型 |
| 中间 | `DIALOG_TYPE_CENTER` | 确认框、表单输入 | `ConfirmDialogModel` | | 中间 | `DIALOG_TYPE_CENTER` | 确认框、表单输入 | `ConfirmDialogModel` |
| 抽屉 | `DIALOG_TYPE_DRAWER` | 筛选条件 | `GjcQueryFilterDialogModel` | | 抽屉 | `DIALOG_TYPE_DRAWER` | 通用右侧抽屉 | 见下方模板 |
| 全屏 | `DIALOG_TYPE_FULL` | 列表展示 | `NoticeMessageDialogModel` | | 全屏 | `DIALOG_TYPE_FULL` | 列表展示 | `NoticeMessageDialogModel` |
### 抽屉弹窗(筛选场景) ### 抽屉弹窗(筛选场景)

View File

@@ -278,7 +278,8 @@ class PadDataLayoutNew : FrameLayout {
tvSpinner.text = list.find { b -> b.value == value }?.key ?: value tvSpinner.text = list.find { b -> b.value == value }?.key ?: value
if (value.isNotEmpty() && list.isNotEmpty()) { // 同步 Spinner 选中项(含 value 为空时重置到对应项,如"全部"),修复重置后 UI 不清空的问题
if (list.isNotEmpty()) {
val index = list.indexOfFirst { b -> b.value == value } val index = list.indexOfFirst { b -> b.value == value }
if (index >= 0) { if (index >= 0) {
spinner.post { spinner.post {

View File

@@ -1,56 +1,122 @@
package com.lukouguoji.gjc.activity package com.lukouguoji.gjc.activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import com.alibaba.android.arouter.facade.annotation.Route import android.view.Gravity
import com.lukouguoji.gjc.R import android.view.View
import com.lukouguoji.gjc.databinding.ActivityGjcQueryBinding import android.widget.FrameLayout
import com.lukouguoji.gjc.viewModel.GjcQueryViewModel import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.gjc.R
import com.lukouguoji.module_base.common.ConstantEvent import com.lukouguoji.gjc.databinding.ActivityGjcQueryBinding
import com.lukouguoji.module_base.impl.FlowBus import com.lukouguoji.gjc.viewModel.GjcQueryViewModel
import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.ktx.getLifecycleOwner import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.observe
/** import com.lukouguoji.module_base.ktx.getLifecycleOwner
* 国际出港查询列表页 import com.lukouguoji.module_base.ktx.setUpperCaseAlphanumericFilter
*/ import com.lukouguoji.module_base.ktx.setUpperCaseLetterFilter
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_QUERY_LIST) import com.lukouguoji.module_base.router.ARouterConstants
class GjcQueryActivity :
BaseBindingActivity<ActivityGjcQueryBinding, GjcQueryViewModel>() { /**
* 国际出港查询列表页
override fun layoutId() = R.layout.activity_gjc_query */
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_QUERY_LIST)
override fun viewModelClass() = GjcQueryViewModel::class.java class GjcQueryActivity :
BaseBindingActivity<ActivityGjcQueryBinding, GjcQueryViewModel>() {
override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港查询") override fun layoutId() = R.layout.activity_gjc_query
binding.viewModel = viewModel override fun viewModelClass() = GjcQueryViewModel::class.java
// 绑定分页逻辑 override fun initOnCreate(savedInstanceState: Bundle?) {
viewModel.pageModel setBackArrow("国际出港查询")
.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner())
binding.viewModel = viewModel
// 监听刷新事件
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) { // 绑定分页逻辑
viewModel.refresh() viewModel.pageModel
} .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner())
// 初始化代理列表 // 监听刷新事件
viewModel.initAgentList() FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) {
viewModel.refresh()
// 初始加载 }
viewModel.refresh()
} // 初始化代理列表 & 筛选下拉列表
viewModel.initAgentList()
companion object { viewModel.initFilterLists()
@JvmStatic
fun start(context: Context) { // 观察筛选面板显示状态
val starter = Intent(context, GjcQueryActivity::class.java) viewModel.filterVisible.observe(this) { visible ->
context.startActivity(starter) if (visible) showFilterPanel() else hideFilterPanel()
} }
}
} // 航班号:大写字母+数字
binding.filterPanel.filterFlightNo.et.setUpperCaseAlphanumericFilter()
// 目的港:仅大写字母
binding.filterPanel.filterDest.et.setUpperCaseLetterFilter()
// 初始加载
viewModel.refresh()
}
private fun showFilterPanel() {
val panel = binding.filterPanel.root
val overlay = binding.filterOverlay
val panelWidth = window.decorView.width / 3
panel.layoutParams = (panel.layoutParams as FrameLayout.LayoutParams).apply {
width = panelWidth
gravity = Gravity.END
}
// 先 INVISIBLE 完成测量,避免第一次显示时闪烁
panel.visibility = View.INVISIBLE
panel.translationX = panelWidth.toFloat()
overlay.visibility = View.VISIBLE
overlay.alpha = 0f
panel.post {
panel.visibility = View.VISIBLE
panel.animate().translationX(0f).setDuration(250).start()
overlay.animate().alpha(1f).setDuration(250).start()
}
}
private fun hideFilterPanel() {
val panel = binding.filterPanel.root
val overlay = binding.filterOverlay
if (panel.visibility != View.VISIBLE) return
panel.animate()
.translationX(panel.width.toFloat())
.setDuration(250)
.withEndAction { panel.visibility = View.GONE }
.start()
overlay.animate()
.alpha(0f)
.setDuration(250)
.withEndAction { overlay.visibility = View.GONE }
.start()
}
override fun onBackPressed() {
if (viewModel.filterVisible.value == true) {
viewModel.closeFilter()
} else {
super.onBackPressed()
}
}
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, GjcQueryActivity::class.java)
context.startActivity(starter)
}
}
}

View File

@@ -1,101 +0,0 @@
package com.lukouguoji.gjc.dialog
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.lifecycle.MutableLiveData
import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.DialogGjcQueryFilterBinding
import com.lukouguoji.module_base.base.BaseDialogModel
import com.lxj.xpopup.XPopup
import com.lxj.xpopup.enums.PopupPosition
import dev.DevUtils
import dev.utils.app.info.KeyValue
/**
* 国际出港查询筛选抽屉
*/
class GjcQueryFilterDialogModel(
val spCode: MutableLiveData<String>, // 特码
val flightNo: MutableLiveData<String>, // 航班号
val dest: MutableLiveData<String>, // 目的港
val awbType: MutableLiveData<String>, // 运单类型
val businessType: MutableLiveData<String>, // 业务类型
val goodsCn: MutableLiveData<String>, // 品名(中)
private val onConfirm: () -> Unit
) : BaseDialogModel<DialogGjcQueryFilterBinding>(DIALOG_TYPE_DRAWER) {
// 运单类型列表
val awbTypeList = MutableLiveData(
listOf(
KeyValue("全部", ""),
KeyValue("主单", "1"),
KeyValue("分单", "2")
)
)
// 业务类型列表
val businessTypeList = MutableLiveData(
listOf(
KeyValue("全部", ""),
KeyValue("普货", "1"),
KeyValue("特货", "2")
)
)
override fun layoutId() = R.layout.dialog_gjc_query_filter
override fun onBuild(builder: XPopup.Builder) {
super.onBuild(builder)
// 设置从右边弹出
builder.popupPosition(PopupPosition.Right)
// 设置抽屉宽度为 Activity contentView 宽度的1/3横屏长边
val activity = DevUtils.getTopActivity()
val activityWidth = activity.window.decorView.width
builder.maxWidth(activityWidth / 3)
builder.popupWidth(activityWidth / 3)
}
override fun onDialogCreated(context: Context) {
binding.model = this
binding.lifecycleOwner = context as? androidx.lifecycle.LifecycleOwner
val titleColor = Color.parseColor("#666666")
// 设置标题
binding.root.findViewById<TextView>(R.id.title_name)?.text = "筛选条件"
binding.root.findViewById<TextView>(R.id.title_name)?.setTextColor(titleColor)
binding.root.findViewById<TextView>(R.id.tool_tv_back)?.setTextColor(titleColor)
binding.root.findViewById<ImageView>(R.id.tool_iv_back)?.imageTintList = ColorStateList.valueOf(titleColor)
binding.root.findViewById<View>(R.id.toolbar)?.setBackgroundColor(Color.WHITE)
// 返回按钮
binding.root.findViewById<View>(R.id.tool_back)?.setOnClickListener {
dismiss()
}
}
/**
* 重置筛选条件
*/
fun onResetClick() {
spCode.value = ""
flightNo.value = ""
dest.value = ""
awbType.value = ""
businessType.value = ""
goodsCn.value = ""
}
/**
* 确认筛选
*/
fun onConfirmClick() {
dismiss()
onConfirm()
}
}

View File

@@ -2,9 +2,9 @@ package com.lukouguoji.gjc.viewModel
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.dialog.GjcQueryFilterDialogModel
import com.lukouguoji.gjc.holder.GjcQueryViewHolder import com.lukouguoji.gjc.holder.GjcQueryViewHolder
import com.lukouguoji.module_base.base.BasePageViewModel import com.lukouguoji.module_base.base.BasePageViewModel
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
@@ -14,6 +14,7 @@ import com.lukouguoji.module_base.ktx.launchLoadingCollect
import com.lukouguoji.module_base.ktx.showToast import com.lukouguoji.module_base.ktx.showToast
import com.lukouguoji.module_base.ktx.toRequestBody import com.lukouguoji.module_base.ktx.toRequestBody
import com.lukouguoji.module_base.model.ScanModel import com.lukouguoji.module_base.model.ScanModel
import com.lukouguoji.module_base.util.DictUtils
import dev.utils.app.info.KeyValue import dev.utils.app.info.KeyValue
import dev.utils.common.DateUtils import dev.utils.common.DateUtils
import com.lukouguoji.module_base.ktx.formatDate import com.lukouguoji.module_base.ktx.formatDate
@@ -52,7 +53,22 @@ class GjcQueryViewModel : BasePageViewModel() {
val totalPc = MutableLiveData("0") // 总件数 val totalPc = MutableLiveData("0") // 总件数
val totalWeight = MutableLiveData("0") // 总重量 val totalWeight = MutableLiveData("0") // 总重量
// ==================== 筛选条件(预留)==================== // ==================== 筛选面板 ====================
val filterVisible = MutableLiveData(false)
// 运单类型列表(字典接口 typeCode/awbtype=IO 国际出港)
val awbTypeList = MutableLiveData<List<KeyValue>>(emptyList())
// 业务类型列表
val businessTypeList = MutableLiveData(
listOf(
KeyValue("全部", ""),
KeyValue("普货", "1"),
KeyValue("特货", "2")
)
)
// ==================== 筛选条件 ====================
val spCode = MutableLiveData("") // 特码 val spCode = MutableLiveData("") // 特码
val flightNo = MutableLiveData("") // 航班号 val flightNo = MutableLiveData("") // 航班号
val dest = MutableLiveData("") // 目的港 val dest = MutableLiveData("") // 目的港
@@ -60,6 +76,20 @@ class GjcQueryViewModel : BasePageViewModel() {
val businessType = MutableLiveData("") // 业务类型 val businessType = MutableLiveData("") // 业务类型
val goodsCn = MutableLiveData("") // 品名(中) val goodsCn = MutableLiveData("") // 品名(中)
// 是否有筛选条件(任意一个非空则为 true用于筛选按钮红点
val hasFilter: MediatorLiveData<Boolean> = MediatorLiveData<Boolean>().apply {
val update = { _: Any? ->
value = listOf(spCode, flightNo, dest, awbType, businessType, goodsCn)
.any { !it.value.isNullOrEmpty() }
}
addSource(spCode, update)
addSource(flightNo, update)
addSource(dest, update)
addSource(awbType, update)
addSource(businessType, update)
addSource(goodsCn, update)
}
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// 方法区 // 方法区
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@@ -79,19 +109,50 @@ class GjcQueryViewModel : BasePageViewModel() {
} }
/** /**
* 筛选按钮点击 * 筛选按钮点击 - 打开筛选面板
*/ */
fun filterClick() { fun filterClick() {
val filterDialog = GjcQueryFilterDialogModel( filterVisible.value = true
spCode = spCode, }
flightNo = flightNo,
dest = dest, /**
awbType = awbType, * 关闭筛选面板
businessType = businessType, */
goodsCn = goodsCn, fun closeFilter() {
onConfirm = { refresh() } filterVisible.value = false
) }
filterDialog.show()
/**
* 重置筛选条件
*/
fun resetFilter() {
spCode.value = ""
flightNo.value = ""
dest.value = ""
awbType.value = ""
businessType.value = ""
goodsCn.value = ""
}
/**
* 确认筛选 - 关闭面板并刷新
*/
fun confirmFilter() {
filterVisible.value = false
refresh()
}
/**
* 初始化筛选下拉列表运单类型从字典接口获取type=IO 国际出港)
*/
fun initFilterLists() {
DictUtils.getWaybillTypeList(
type = Constant.businessType.IO,
addAll = true,
checkedValue = awbType.value
) {
awbTypeList.postValue(it)
}
} }
/** /**
@@ -110,7 +171,7 @@ class GjcQueryViewModel : BasePageViewModel() {
"wbNo" to waybillNo.value!!.ifEmpty { null }, "wbNo" to waybillNo.value!!.ifEmpty { null },
// 筛选条件(暂未使用) // 筛选条件(暂未使用)
"spCode" to spCode.value!!.ifEmpty { null }, "spCode" to spCode.value!!.ifEmpty { null },
"flightNo" to flightNo.value!!.ifEmpty { null }, "fno" to flightNo.value!!.ifEmpty { null },
"dest" to dest.value!!.ifEmpty { null }, "dest" to dest.value!!.ifEmpty { null },
"awbType" to awbType.value!!.ifEmpty { null }, "awbType" to awbType.value!!.ifEmpty { null },
"businessType" to businessType.value!!.ifEmpty { null }, "businessType" to businessType.value!!.ifEmpty { null },
@@ -126,7 +187,7 @@ class GjcQueryViewModel : BasePageViewModel() {
"wbNo" to waybillNo.value!!.ifEmpty { null }, "wbNo" to waybillNo.value!!.ifEmpty { null },
// 筛选条件 // 筛选条件
"spCode" to spCode.value!!.ifEmpty { null }, "spCode" to spCode.value!!.ifEmpty { null },
"flightNo" to flightNo.value!!.ifEmpty { null }, "fno" to flightNo.value!!.ifEmpty { null },
"dest" to dest.value!!.ifEmpty { null }, "dest" to dest.value!!.ifEmpty { null },
"awbType" to awbType.value!!.ifEmpty { null }, "awbType" to awbType.value!!.ifEmpty { null },
"businessType" to businessType.value!!.ifEmpty { null }, "businessType" to businessType.value!!.ifEmpty { null },

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#F44336" />
</shape>

View File

@@ -1,187 +1,237 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<data> <data>
<import type="android.view.View" />
<import type="com.lukouguoji.module_base.ui.weight.search.layout.SearchLayoutType" /> <import type="com.lukouguoji.module_base.ui.weight.search.layout.SearchLayoutType" />
<variable <variable
name="viewModel" name="viewModel"
type="com.lukouguoji.gjc.viewModel.GjcQueryViewModel" /> type="com.lukouguoji.gjc.viewModel.GjcQueryViewModel" />
</data> </data>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/color_f2" android:background="@color/color_f2"
android:orientation="vertical"> android:orientation="vertical">
<!-- 标题栏 --> <!-- 标题栏(始终在最上层,不被遮挡) -->
<include layout="@layout/title_tool_bar" /> <include layout="@layout/title_tool_bar" />
<!-- 搜索区域 --> <!-- 内容区域FrameLayout 包裹,筛选面板和遮罩只在此区域内) -->
<LinearLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="0dp"
android:layout_marginHorizontal="10dp" android:layout_weight="1">
android:layout_marginTop="10dp"
android:gravity="center_vertical" <!-- 原有内容 -->
android:orientation="horizontal"> <LinearLayout
android:layout_width="match_parent"
<!-- 航班日期起 --> android:layout_height="match_parent"
<com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout android:orientation="vertical">
android:layout_width="0dp"
android:layout_height="wrap_content" <!-- 搜索区域 -->
android:layout_weight="1" <LinearLayout
hint='@{"请选择开始日期"}' android:layout_width="match_parent"
icon="@{@drawable/img_date}" android:layout_height="wrap_content"
type="@{SearchLayoutType.DATE}" android:layout_marginHorizontal="10dp"
value="@={viewModel.flightDateStart}" /> android:layout_marginTop="10dp"
android:gravity="center_vertical"
<!-- 航班日期止 --> android:orientation="horizontal">
<com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_width="0dp" <!-- 航班日期起 -->
android:layout_height="wrap_content" <com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_weight="1" android:layout_width="0dp"
hint='@{"请选择结束日期"}' android:layout_height="wrap_content"
icon="@{@drawable/img_date}" android:layout_weight="1"
type="@{SearchLayoutType.DATE}" hint='@{"请选择开始日期"}'
value="@={viewModel.flightDateEnd}" /> icon="@{@drawable/img_date}"
type="@{SearchLayoutType.DATE}"
<!-- 代理人 --> value="@={viewModel.flightDateStart}" />
<com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_width="0dp" <!-- 航班日期止 -->
android:layout_height="wrap_content" <com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_weight="1" android:layout_width="0dp"
hint='@{"请选择代理"}' android:layout_height="wrap_content"
list="@{viewModel.agentList}" android:layout_weight="1"
type="@{SearchLayoutType.SPINNER}" hint='@{"请选择结束日期"}'
value="@={viewModel.agentId}" /> icon="@{@drawable/img_date}"
type="@{SearchLayoutType.DATE}"
<!-- 出库状态 --> value="@={viewModel.flightDateEnd}" />
<com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_width="0dp" <!-- 代理人 -->
android:layout_height="wrap_content" <com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_weight="1" android:layout_width="0dp"
hint='@{"请选择出库状态"}' android:layout_height="wrap_content"
list="@{viewModel.outStatusList}" android:layout_weight="1"
type="@{SearchLayoutType.SPINNER}" hint='@{"请选择代理"}'
value="@={viewModel.outStatus}" /> list="@{viewModel.agentList}"
type="@{SearchLayoutType.SPINNER}"
<!-- 运单号 --> value="@={viewModel.agentId}" />
<com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_width="0dp" <!-- 出库状态 -->
android:layout_height="wrap_content" <com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
android:layout_weight="1" android:layout_width="0dp"
hint='@{"请输入运单号"}' android:layout_height="wrap_content"
icon="@{@drawable/img_scan}" android:layout_weight="1"
setOnIconClickListener="@{()-> viewModel.waybillScanClick()}" hint='@{"请选择出库状态"}'
type="@{SearchLayoutType.INPUT}" list="@{viewModel.outStatusList}"
value="@={viewModel.waybillNo}" type="@{SearchLayoutType.SPINNER}"
autoQueryEnabled="@{true}" value="@={viewModel.outStatus}" />
autoQueryUrl="@{`/IntExpSearch/queryWbNoList`}"
autoQueryParamKey="@{`wbNo`}" <!-- 运单号 -->
autoQueryMinLength="@{4}" <com.lukouguoji.module_base.ui.weight.search.layout.PadSearchLayout
autoQueryMaxLength="@{8}" android:layout_width="0dp"
autoQueryTitle="@{`选择运单号`}" /> android:layout_height="wrap_content"
android:layout_weight="1"
<!-- 搜索和筛选按钮 --> hint='@{"请输入运单号"}'
<LinearLayout icon="@{@drawable/img_scan}"
android:layout_width="0dp" setOnIconClickListener="@{()-> viewModel.waybillScanClick()}"
android:layout_height="wrap_content" type="@{SearchLayoutType.INPUT}"
android:layout_weight="1" value="@={viewModel.waybillNo}"
android:gravity="center_vertical|start" autoQueryEnabled="@{true}"
android:orientation="horizontal" autoQueryUrl="@{`/IntExpSearch/queryWbNoList`}"
android:paddingHorizontal="24dp"> autoQueryParamKey="@{`wbNo`}"
autoQueryMinLength="@{4}"
<!-- 搜索按钮 --> autoQueryMaxLength="@{8}"
<ImageView autoQueryTitle="@{`选择运单号`}" />
android:layout_width="36dp"
android:layout_height="36dp" <!-- 搜索和筛选按钮 -->
android:onClick="@{()-> viewModel.searchClick()}" <LinearLayout
android:padding="2dp" android:layout_width="0dp"
android:src="@drawable/img_search" /> android:layout_height="wrap_content"
android:layout_weight="1"
<!-- 筛选按钮 --> android:gravity="center_vertical|start"
<ImageView android:orientation="horizontal"
android:layout_width="36dp" android:paddingHorizontal="24dp">
android:layout_height="36dp"
android:layout_marginLeft="16dp" <!-- 搜索按钮 -->
android:onClick="@{()-> viewModel.filterClick()}" <ImageView
android:padding="5dp" android:layout_width="36dp"
android:src="@drawable/img_filter" /> android:layout_height="36dp"
android:onClick="@{()-> viewModel.searchClick()}"
</LinearLayout> android:padding="2dp"
android:src="@drawable/img_search" />
</LinearLayout>
<!-- 筛选按钮(含红点) -->
<!-- 列表区域 --> <FrameLayout
<com.scwang.smart.refresh.layout.SmartRefreshLayout android:layout_width="36dp"
android:id="@+id/srl" android:layout_height="36dp"
android:layout_width="match_parent" android:layout_marginLeft="16dp">
android:layout_height="0dp"
android:layout_weight="1"> <ImageView
android:layout_width="match_parent"
<androidx.recyclerview.widget.RecyclerView android:layout_height="match_parent"
android:id="@+id/rv" android:onClick="@{()-> viewModel.filterClick()}"
android:layout_width="match_parent" android:padding="5dp"
android:layout_height="match_parent" android:src="@drawable/img_filter" />
itemLayoutId="@{viewModel.itemLayoutId}"
viewHolder="@{viewModel.itemViewHolder}" <View
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" android:layout_width="8dp"
tools:listitem="@layout/item_gjc_query" /> android:layout_height="8dp"
android:layout_gravity="top|end"
</com.scwang.smart.refresh.layout.SmartRefreshLayout> android:background="@drawable/bg_red_dot"
android:visibility="@{viewModel.hasFilter ? View.VISIBLE : View.GONE}" />
<!-- 底部统计信息 -->
<LinearLayout </FrameLayout>
android:layout_width="match_parent"
android:layout_height="50dp" </LinearLayout>
android:background="@color/white"
android:gravity="center_vertical" </LinearLayout>
android:paddingHorizontal="15dp">
<!-- 列表区域 -->
<!-- 统计信息 --> <com.scwang.smart.refresh.layout.SmartRefreshLayout
<LinearLayout android:id="@+id/srl"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="0dp"
android:gravity="center_vertical" android:layout_weight="1">
android:orientation="horizontal">
<androidx.recyclerview.widget.RecyclerView
<TextView android:id="@+id/rv"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:text='@{`合计:` + viewModel.totalCount + `票`}' itemLayoutId="@{viewModel.itemLayoutId}"
android:textColor="@color/bottom_tool_tips_text_color" viewHolder="@{viewModel.itemViewHolder}"
android:textSize="16sp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:textStyle="bold" tools:listitem="@layout/item_gjc_query" />
tools:text="合计3票" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
<TextView
android:layout_width="wrap_content" <!-- 底部统计信息 -->
android:layout_height="wrap_content" <LinearLayout
android:layout_marginLeft="20dp" android:layout_width="match_parent"
android:text='@{`总件数:` + viewModel.totalPc}' android:layout_height="50dp"
android:textColor="@color/bottom_tool_tips_text_color" android:background="@color/white"
android:textSize="16sp" android:gravity="center_vertical"
android:textStyle="bold" android:paddingHorizontal="15dp">
tools:text="总件数100" />
<!-- 统计信息 -->
<TextView <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="20dp" android:gravity="center_vertical"
android:text='@{`总重量:` + viewModel.totalWeight}' android:orientation="horizontal">
android:textColor="@color/bottom_tool_tips_text_color"
android:textSize="16sp" <TextView
android:textStyle="bold" android:layout_width="wrap_content"
tools:text="总重量100" /> android:layout_height="wrap_content"
android:text='@{`合计:` + viewModel.totalCount + `票`}'
</LinearLayout> android:textColor="@color/bottom_tool_tips_text_color"
android:textSize="16sp"
</LinearLayout> android:textStyle="bold"
tools:text="合计3票" />
</LinearLayout>
</layout> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text='@{`总件数:` + viewModel.totalPc}'
android:textColor="@color/bottom_tool_tips_text_color"
android:textSize="16sp"
android:textStyle="bold"
tools:text="总件数100" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text='@{`总重量:` + viewModel.totalWeight}'
android:textColor="@color/bottom_tool_tips_text_color"
android:textSize="16sp"
android:textStyle="bold"
tools:text="总重量100" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<!-- 遮罩层(只覆盖内容区域) -->
<View
android:id="@+id/filter_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"
android:clickable="true"
android:focusable="true"
android:onClick="@{()-> viewModel.closeFilter()}"
android:visibility="gone" />
<!-- 筛选面板(从右侧滑入,只在内容区域内) -->
<include
android:id="@+id/filter_panel"
layout="@layout/layout_gjc_query_filter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:visibility="gone"
app:viewModel="@{viewModel}" />
</FrameLayout>
</LinearLayout>
</layout>

View File

@@ -1,158 +1,171 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <layout xmlns:android="http://schemas.android.com/apk/res/android">
<data> <data>
<import type="com.lukouguoji.module_base.ui.weight.data.layout.DataLayoutType" />
<import type="com.lukouguoji.module_base.ui.weight.data.layout.DataLayoutType" />
<variable
<variable name="viewModel"
name="model" type="com.lukouguoji.gjc.viewModel.GjcQueryViewModel" />
type="com.lukouguoji.gjc.dialog.GjcQueryFilterDialogModel" /> </data>
</data>
<LinearLayout
<LinearLayout android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_height="match_parent" android:background="@color/white"
android:background="@color/white" android:elevation="8dp"
android:orientation="vertical"> android:orientation="vertical">
<!-- 状态栏占位 --> <!-- 筛选标题栏 -->
<View <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="25dp" android:layout_height="50dp"
android:background="@color/white" /> android:gravity="center_vertical"
android:paddingHorizontal="15dp">
<!-- 标题栏 -->
<include layout="@layout/title_tool_bar" /> <ImageView
android:layout_width="15dp"
<com.google.android.material.divider.MaterialDivider android:layout_height="15dp"
android:layout_width="match_parent" android:onClick="@{()-> viewModel.closeFilter()}"
android:layout_height="1dp"/> android:src="@mipmap/left_icon"
android:tint="#666666" />
<!-- 筛选条件区域 -->
<ScrollView <TextView
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_marginLeft="10dp"
android:padding="15dp"> android:text="筛选条件"
android:textColor="#666666"
<LinearLayout android:textSize="16sp" />
android:layout_width="match_parent"
android:layout_height="wrap_content" </LinearLayout>
android:orientation="vertical">
<com.google.android.material.divider.MaterialDivider
<!-- 特码 --> android:layout_width="match_parent"
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew android:layout_height="1dp" />
hint='@{"请输入特码"}'
title='@{"特码"}' <!-- 筛选条件区域 -->
titleLength="@{4}" <ScrollView
type="@{DataLayoutType.INPUT}" android:layout_width="match_parent"
value='@={model.spCode}' android:layout_height="0dp"
android:layout_width="match_parent" android:layout_weight="1"
android:layout_height="wrap_content" android:padding="15dp">
android:layout_marginBottom="10dp" />
<LinearLayout
<!-- 航班号 --> android:layout_width="match_parent"
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew android:layout_height="wrap_content"
hint='@{"请输入航班号"}' android:orientation="vertical">
title='@{"航班号"}'
titleLength="@{4}" <!-- 特码 -->
type="@{DataLayoutType.INPUT}" <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
value='@={model.flightNo}' android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_marginBottom="10dp"
android:layout_marginBottom="10dp" /> hint='@{"请输入特码"}'
title='@{"特码"}'
<!-- 目的港 --> titleLength="@{4}"
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew type="@{DataLayoutType.INPUT}"
hint='@{"请输入目的港"}' value='@={viewModel.spCode}' />
title='@{"目的港"}'
titleLength="@{4}" <!-- 航班号 -->
type="@{DataLayoutType.INPUT}" <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
value='@={model.dest}' android:id="@+id/filter_flight_no"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="10dp" /> android:layout_marginBottom="10dp"
hint='@{"请输入航班号"}'
<!-- 运单类型 --> title='@{"航班号"}'
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew titleLength="@{4}"
hint='@{"请选择运单类型"}' type="@{DataLayoutType.INPUT}"
list="@{model.awbTypeList}" value='@={viewModel.flightNo}' />
title='@{"运单类型"}'
titleLength="@{4}" <!-- 目的港 -->
type="@{DataLayoutType.SPINNER}" <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
value='@={model.awbType}' android:id="@+id/filter_dest"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="10dp" /> android:layout_marginBottom="10dp"
hint='@{"请输入目的港"}'
<!-- 业务类型 --> title='@{"目的港"}'
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew titleLength="@{4}"
hint='@{"请选择业务类型"}' type="@{DataLayoutType.INPUT}"
list="@{model.businessTypeList}" value='@={viewModel.dest}' />
title='@{"业务类型"}'
titleLength="@{4}" <!-- 运单类型 -->
type="@{DataLayoutType.SPINNER}" <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
value='@={model.businessType}' android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_marginBottom="10dp"
android:layout_marginBottom="10dp" /> hint='@{"请选择运单类型"}'
list="@{viewModel.awbTypeList}"
<!-- 品名(中) --> title='@{"运单类型"}'
<com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew titleLength="@{4}"
hint='@{"请输入品名"}' type="@{DataLayoutType.SPINNER}"
title='@{"品名(中)"}' value='@={viewModel.awbType}' />
titleLength="@{4}"
type="@{DataLayoutType.INPUT}" <!-- 业务类型 -->
value='@={model.goodsCn}' <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="10dp" /> android:layout_marginBottom="10dp"
hint='@{"请选择业务类型"}'
<!-- 底部按钮区域 --> list="@{viewModel.businessTypeList}"
<LinearLayout title='@{"业务类型"}'
android:layout_width="300dp" titleLength="@{4}"
android:layout_height="50dp" type="@{DataLayoutType.SPINNER}"
android:layout_gravity="center_horizontal" value='@={viewModel.businessType}' />
android:layout_marginTop="32dp"
android:background="@color/white" <!-- 品名(中) -->
android:gravity="center" <com.lukouguoji.module_base.ui.weight.data.layout.PadDataLayoutNew
android:orientation="horizontal" android:layout_width="match_parent"
android:paddingHorizontal="15dp"> android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
<!-- 重置按钮 --> hint='@{"请输入品名"}'
<TextView title='@{"品名(中)"}'
android:layout_width="0dp" titleLength="@{4}"
android:layout_height="40dp" type="@{DataLayoutType.INPUT}"
android:layout_marginRight="24dp" value='@={viewModel.goodsCn}' />
android:layout_weight="1"
android:background="@drawable/bg_primary_radius_4" <!-- 底部按钮区域 -->
android:gravity="center" <LinearLayout
android:onClick="@{()-> model.onResetClick()}" android:layout_width="300dp"
android:text="重置" android:layout_height="50dp"
android:textColor="@color/white" android:layout_gravity="center_horizontal"
android:textSize="16sp" /> android:layout_marginTop="32dp"
android:background="@color/white"
<!-- 搜索按钮 --> android:gravity="center"
<TextView android:orientation="horizontal"
android:layout_width="0dp" android:paddingHorizontal="15dp">
android:layout_height="40dp"
android:layout_weight="1" <TextView
android:background="@drawable/bg_primary_radius_4" android:layout_width="0dp"
android:gravity="center" android:layout_height="40dp"
android:onClick="@{()-> model.onConfirmClick()}" android:layout_marginRight="24dp"
android:text="搜索" android:layout_weight="1"
android:textColor="@color/white" android:background="@drawable/bg_primary_radius_4"
android:textSize="16sp" /> android:gravity="center"
android:onClick="@{()-> viewModel.resetFilter()}"
</LinearLayout> android:text="重置"
android:textColor="@color/white"
</LinearLayout> android:textSize="16sp" />
<TextView
</ScrollView> android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
</LinearLayout> android:background="@drawable/bg_primary_radius_4"
android:gravity="center"
</layout> android:onClick="@{()-> viewModel.confirmFilter()}"
android:text="搜索"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
</layout>