fix: 11模块设计稿全量走查修正——时间线状态pill/手机短标题/ULD字段顺序/计重卡片图标

设计稿逐态渲染对照走查(01~11 全模块)后的修正:
- 运单追踪竖排时间线为已发生节点补状态pill(绿底展示该环节日志content,超长省略)
- 11 页手机端标题按设计稿改短标题(DeviceUtil.isPhone 分支,平板长标题零变化):
  出库交接/出港待计重/计重记录/计重明细/开始计重/出港运抵/出港移库/出港查询/
  出港货物/进港查询/进港货物
- ULD 编辑表单「来源」移至「所在港」之后(设计稿顺序)
- 出港计重列表卡片与计重记录卡片补字段小图标(airplane/location/person/tag)

接口缺口台账复核:#31 进港移库整模块缺失成立(api-doc 全模块清单+报价单双重印证);
#19 修正定性——IntExpArrive/declare 入参已含收发货人全套字段,改登记为待确认提交口径;
#10 成立(单条 deleteUld 在、批量无)。

双端抽验:手机短标题三页生效(出港待计重/出库交接/进港货物),平板保持长标题,零崩溃。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 23:12:14 +08:00
parent a33776d959
commit eb0655d3fc
17 changed files with 1124 additions and 1009 deletions

View File

@@ -33,6 +33,14 @@
表头)、`bg_phone_photo_add`(虚线加号槽位)、色值 `phone_amber` 表头)、`bg_phone_photo_add`(虚线加号槽位)、色值 `phone_amber`
### 修复 (Fixed) ### 修复 (Fixed)
- 【11 模块全量设计稿走查】修正 4 类差异2026-07-313 个并行审计 + 逐态渲染比对):
① 运单追踪手机竖排时间线补齐已发生节点的状态 pill绿底标签展示该环节日志 content
如「放行状态01」超长省略设计稿 06/08 运单追踪均有此元素);
② 11 个页面手机端标题对齐设计稿短标题(出库交接/出港待计重/计重记录/计重明细/开始计重/
出港运抵/出港移库/出港查询/出港货物/进港查询/进港货物),平板保持原长标题零变化;
③ ULD 编辑表单「来源」字段移至「所在港」之后(设计稿顺序);
④ 出港计重列表卡片(日期/航程/代理/特码)与计重记录卡片(代理)补齐字段小图标
(复用 ic_phone_airplane/location/person/tag与其余模块卡片风格统一
- 出港查询/进港查询卡片「代理人」空值兜底失效:转换器把 JSON null 归一成空串DataBinding - 出港查询/进港查询卡片「代理人」空值兜底失效:转换器把 JSON null 归一成空串DataBinding
`??` 只判 null 不判空串导致 agentCode 回退永不生效;改用 Bean 计算属性 `agentDisplay` `??` 只判 null 不判空串导致 agentCode 回退永不生效;改用 Bean 计算属性 `agentDisplay`
isNullOrEmpty 双兜底),已同步修正 06 出港查询(`item_gjc_query.xml` isNullOrEmpty 双兜底),已同步修正 06 出港查询(`item_gjc_query.xml`

View File

@@ -91,7 +91,9 @@ class LogDetailActivity : BaseBindingActivity<ActivityLogDetailBinding, LogDetai
val step = steps[i] val step = steps[i]
val isActive = step.code in activeCodes val isActive = step.code in activeCodes
val isLast = i == steps.size - 1 val isLast = i == steps.size - 1
val time = logs.lastOrNull { it.status == step.code }?.opDate ?: "" val stepLog = logs.lastOrNull { it.status == step.code }
val time = stepLog?.opDate ?: ""
val statusContent = stepLog?.content ?: ""
val row = LinearLayout(this).apply { val row = LinearLayout(this).apply {
orientation = LinearLayout.HORIZONTAL orientation = LinearLayout.HORIZONTAL
@@ -141,12 +143,41 @@ class LogDetailActivity : BaseBindingActivity<ActivityLogDetailBinding, LogDetai
} }
setPadding(0, 0, 0, if (isLast) 0 else dp(24)) setPadding(0, 0, 0, if (isLast) 0 else dp(24))
} }
content.addView(TextView(this).apply { // 名称行:步骤名(左)+ 已发生节点的状态 pill设计稿如「放行状态01」
val nameRow = LinearLayout(this).apply {
orientation = LinearLayout.HORIZONTAL
gravity = Gravity.CENTER_VERTICAL
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
}
nameRow.addView(TextView(this).apply {
text = step.name text = step.name
setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f) setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f)
setTextColor(if (isActive) colorGreen else colorGray) setTextColor(if (isActive) colorGreen else colorGray)
if (isActive) setTypeface(typeface, android.graphics.Typeface.BOLD) if (isActive) setTypeface(typeface, android.graphics.Typeface.BOLD)
layoutParams = LinearLayout.LayoutParams(
0, LinearLayout.LayoutParams.WRAP_CONTENT
).apply { weight = 1f }
}) })
if (isActive && statusContent.isNotEmpty()) {
nameRow.addView(TextView(this).apply {
text = statusContent
setTextSize(TypedValue.COMPLEX_UNIT_SP, 11f)
setTextColor(colorGreen)
setBackgroundResource(com.lukouguoji.module_base.R.drawable.bg_phone_tag_green)
setPadding(dp(8), dp(3), dp(8), dp(3))
maxLines = 1
ellipsize = android.text.TextUtils.TruncateAt.END
maxWidth = dp(180)
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
).apply { leftMargin = dp(8) }
})
}
content.addView(nameRow)
if (time.isNotEmpty()) { if (time.isNotEmpty()) {
content.addView(TextView(this).apply { content.addView(TextView(this).apply {
text = time text = time

View File

@@ -160,17 +160,6 @@
type="@{viewModel.pageType == DetailsPageType.Details ? PhoneFormRowType.TEXT : PhoneFormRowType.SELECT}" type="@{viewModel.pageType == DetailsPageType.Details ? PhoneFormRowType.TEXT : PhoneFormRowType.SELECT}"
value="@={viewModel.uldBean.carrier}" /> value="@={viewModel.uldBean.carrier}" />
<!-- 来源(后端字段暂不支持,已登记清单;提交后端忽略) -->
<com.lukouguoji.module_base.ui.weight.phone.PhoneFormRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
enable="@{viewModel.pageType != DetailsPageType.Details}"
hint='@{"请选择来源"}'
list="@{viewModel.sourceEditList}"
title='@{"来源"}'
type="@{viewModel.pageType == DetailsPageType.Details ? PhoneFormRowType.TEXT : PhoneFormRowType.SELECT}"
value="@={viewModel.uldBean.source}" />
<!-- 自重(kg) --> <!-- 自重(kg) -->
<com.lukouguoji.module_base.ui.weight.phone.PhoneFormRow <com.lukouguoji.module_base.ui.weight.phone.PhoneFormRow
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -221,6 +210,17 @@
type="@{viewModel.pageType == DetailsPageType.Details ? PhoneFormRowType.TEXT : PhoneFormRowType.INPUT}" type="@{viewModel.pageType == DetailsPageType.Details ? PhoneFormRowType.TEXT : PhoneFormRowType.INPUT}"
value="@={viewModel.uldBean.airport}" /> value="@={viewModel.uldBean.airport}" />
<!-- 来源(设计稿顺序位于所在港之后;后端字段暂不支持,已登记清单,提交后端忽略) -->
<com.lukouguoji.module_base.ui.weight.phone.PhoneFormRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
enable="@{viewModel.pageType != DetailsPageType.Details}"
hint='@{"请选择来源"}'
list="@{viewModel.sourceEditList}"
title='@{"来源"}'
type="@{viewModel.pageType == DetailsPageType.Details ? PhoneFormRowType.TEXT : PhoneFormRowType.SELECT}"
value="@={viewModel.uldBean.source}" />
<!-- 入库时间(绑 checkInDate筛选/格式语义待后端确认,已登记清单) --> <!-- 入库时间(绑 checkInDate筛选/格式语义待后端确认,已登记清单) -->
<com.lukouguoji.module_base.ui.weight.phone.PhoneFormRow <com.lukouguoji.module_base.ui.weight.phone.PhoneFormRow
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -32,7 +32,7 @@ class GjcQueryActivity :
override fun viewModelClass() = GjcQueryViewModel::class.java override fun viewModelClass() = GjcQueryViewModel::class.java
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港查询") setBackArrow(if (DeviceUtil.isPhone()) "出港查询" else "国际出港查询")
binding.viewModel = viewModel binding.viewModel = viewModel

View File

@@ -1,90 +1,91 @@
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 android.view.Gravity import android.view.Gravity
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityGjcQueryDetailsBinding import com.lukouguoji.gjc.databinding.ActivityGjcQueryDetailsBinding
import com.lukouguoji.gjc.viewModel.GjcQueryDetailsViewModel import com.lukouguoji.gjc.viewModel.GjcQueryDetailsViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.base.CustomVP2Adapter import com.lukouguoji.module_base.base.CustomVP2Adapter
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil
/**
* 国际出港查询详情页面 /**
*/ * 国际出港查询详情页面
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_QUERY_DETAILS) */
class GjcQueryDetailsActivity : @Route(path = ARouterConstants.ACTIVITY_URL_GJC_QUERY_DETAILS)
BaseBindingActivity<ActivityGjcQueryDetailsBinding, GjcQueryDetailsViewModel>() { class GjcQueryDetailsActivity :
BaseBindingActivity<ActivityGjcQueryDetailsBinding, GjcQueryDetailsViewModel>() {
override fun layoutId() = R.layout.activity_gjc_query_details
override fun viewModelClass() = GjcQueryDetailsViewModel::class.java override fun layoutId() = R.layout.activity_gjc_query_details
override fun viewModelClass() = GjcQueryDetailsViewModel::class.java
override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港查询详情") override fun initOnCreate(savedInstanceState: Bundle?) {
binding.viewModel = viewModel setBackArrow(if (DeviceUtil.isPhone()) "出港货物" else "国际出港查询详情")
binding.viewModel = viewModel
// 初始化ViewModel(传入maWbId)
viewModel.initOnCreated(intent) // 初始化ViewModel(传入maWbId)
viewModel.initOnCreated(intent)
// 配置ViewPager2
binding.vp.adapter = CustomVP2Adapter( // 配置ViewPager2
viewModel.fragmentList, binding.vp.adapter = CustomVP2Adapter(
supportFragmentManager, viewModel.fragmentList,
lifecycle supportFragmentManager,
) lifecycle
binding.vp.isUserInputEnabled = false // 禁用滑动 )
binding.vp.offscreenPageLimit = 3 // 预加载3个Fragment binding.vp.isUserInputEnabled = false // 禁用滑动
binding.vp.offscreenPageLimit = 3 // 预加载3个Fragment
// 监听Tab索引变化,切换Fragment
viewModel.currentTab.observe(this) { // 监听Tab索引变化,切换Fragment
binding.vp.setCurrentItem(it, false) // false:无动画 viewModel.currentTab.observe(this) {
} binding.vp.setCurrentItem(it, false) // false:无动画
}
// 标题栏右侧添加日志查询图标
val toolbar = findViewById<Toolbar>(com.lukouguoji.module_base.R.id.toolbar) // 标题栏右侧添加日志查询图标
val logIcon = ImageView(this).apply { val toolbar = findViewById<Toolbar>(com.lukouguoji.module_base.R.id.toolbar)
setImageResource(com.lukouguoji.module_base.R.drawable.img_log) val logIcon = ImageView(this).apply {
layoutParams = Toolbar.LayoutParams( setImageResource(com.lukouguoji.module_base.R.drawable.img_log)
LinearLayout.LayoutParams.WRAP_CONTENT, layoutParams = Toolbar.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT LinearLayout.LayoutParams.WRAP_CONTENT,
).apply { LinearLayout.LayoutParams.WRAP_CONTENT
gravity = Gravity.END or Gravity.CENTER_VERTICAL ).apply {
marginEnd = 15 gravity = Gravity.END or Gravity.CENTER_VERTICAL
width = 30.dp marginEnd = 15
height = 30.dp width = 30.dp
} height = 30.dp
setOnClickListener { }
val wbNo = viewModel.maWbData.value?.get("wbNo") as? String ?: "" setOnClickListener {
ARouter.getInstance() val wbNo = viewModel.maWbData.value?.get("wbNo") as? String ?: ""
.build(ARouterConstants.ACTIVITY_URL_LOG_DETAIL) ARouter.getInstance()
.withString(Constant.Key.KEY, wbNo) .build(ARouterConstants.ACTIVITY_URL_LOG_DETAIL)
.withString(Constant.Key.AWB_TYPE, "IO") .withString(Constant.Key.KEY, wbNo)
.navigation() .withString(Constant.Key.AWB_TYPE, "IO")
} .navigation()
} }
toolbar.addView(logIcon) }
toolbar.addView(logIcon)
// 加载详情数据
viewModel.loadDetails() // 加载详情数据
} viewModel.loadDetails()
}
private val Int.dp: Int
get() = (this * resources!!.displayMetrics.density).toInt() private val Int.dp: Int
get() = (this * resources!!.displayMetrics.density).toInt()
companion object {
@JvmStatic companion object {
fun start(context: Context, maWbId: Long?) { @JvmStatic
val starter = Intent(context, GjcQueryDetailsActivity::class.java) fun start(context: Context, maWbId: Long?) {
.putExtra(Constant.Key.ID, maWbId?.toString() ?: "") val starter = Intent(context, GjcQueryDetailsActivity::class.java)
context.startActivity(starter) .putExtra(Constant.Key.ID, maWbId?.toString() ?: "")
} context.startActivity(starter)
} }
} }
}

View File

@@ -1,105 +1,105 @@
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 androidx.databinding.ObservableBoolean import androidx.databinding.ObservableBoolean
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityGjcWeighingListBinding import com.lukouguoji.gjc.databinding.ActivityGjcWeighingListBinding
import com.lukouguoji.gjc.viewModel.GjcWeighingViewModel import com.lukouguoji.gjc.viewModel.GjcWeighingViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.bean.GjcWeighingBean import com.lukouguoji.module_base.bean.GjcWeighingBean
import com.lukouguoji.module_base.common.ConstantEvent import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.impl.FlowBus import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.impl.observe
import com.lukouguoji.module_base.ktx.getLifecycleOwner import com.lukouguoji.module_base.ktx.getLifecycleOwner
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil import com.lukouguoji.module_base.util.DeviceUtil
/** /**
* 国际出港计重列表页 * 国际出港计重列表页
* *
* 布局 id 不区分设备,平板/手机由资源限定符自动选择: * 布局 id 不区分设备,平板/手机由资源限定符自动选择:
* layout-sw600dp/activity_gjc_weighing_list.xml平板 * layout-sw600dp/activity_gjc_weighing_list.xml平板
* layout/activity_gjc_weighing_list.xml手机 * layout/activity_gjc_weighing_list.xml手机
*/ */
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_LIST) @Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_LIST)
class GjcWeighingListActivity : class GjcWeighingListActivity :
BaseBindingActivity<ActivityGjcWeighingListBinding, GjcWeighingViewModel>() { BaseBindingActivity<ActivityGjcWeighingListBinding, GjcWeighingViewModel>() {
override fun layoutId() = R.layout.activity_gjc_weighing_list override fun layoutId() = R.layout.activity_gjc_weighing_list
override fun viewModelClass() = GjcWeighingViewModel::class.java override fun viewModelClass() = GjcWeighingViewModel::class.java
/** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */
val filterPanelVisible = ObservableBoolean(false) val filterPanelVisible = ObservableBoolean(false)
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港待计重") setBackArrow(if (DeviceUtil.isPhone()) "出港待计重" else "国际出港待计重")
binding.viewModel = viewModel binding.viewModel = viewModel
binding.activity = this binding.activity = this
// 手机版专属数据:放开默认日期、加载筛选弹层字典、启用三格统计 // 手机版专属数据:放开默认日期、加载筛选弹层字典、启用三格统计
// 平板端不调用,查询链路与请求次数与改造前完全一致 // 平板端不调用,查询链路与请求次数与改造前完全一致
if (DeviceUtil.isPhone()) { if (DeviceUtil.isPhone()) {
viewModel.initPhoneExtras() viewModel.initPhoneExtras()
} }
// 初始化代理人列表从API获取 // 初始化代理人列表从API获取
viewModel.initAgentList() viewModel.initAgentList()
// 初始化特码列表从API获取 // 初始化特码列表从API获取
viewModel.initSpecialCodeList() viewModel.initSpecialCodeList()
// 绑定分页逻辑 // 绑定分页逻辑
viewModel.pageModel viewModel.pageModel
.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner())
// 监听刷新事件 // 监听刷新事件
FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() }
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH) FlowBus.with<String>(ConstantEvent.EVENT_REFRESH)
.observe(this) { .observe(this) {
viewModel.refresh() viewModel.refresh()
} }
// 初始加载 // 初始加载
viewModel.refresh() viewModel.refresh()
} }
// ==================== 手机版专用交互(纯 UI复用既有 ViewModel 字段) ==================== // ==================== 手机版专用交互(纯 UI复用既有 ViewModel 字段) ====================
/** 手机版筛选弹层显隐切换 */ /** 手机版筛选弹层显隐切换 */
fun toggleFilterPanel() { fun toggleFilterPanel() {
filterPanelVisible.set(!filterPanelVisible.get()) filterPanelVisible.set(!filterPanelVisible.get())
} }
/** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */ /** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */
fun resetFilter() { fun resetFilter() {
viewModel.channelFilter.value = "" viewModel.channelFilter.value = ""
viewModel.carrierFilter.value = "" viewModel.carrierFilter.value = ""
viewModel.awbTypeFilter.value = "" viewModel.awbTypeFilter.value = ""
viewModel.agentCode.value = "" viewModel.agentCode.value = ""
} }
/** 手机版筛选:确认 */ /** 手机版筛选:确认 */
fun confirmFilter() { fun confirmFilter() {
filterPanelVisible.set(false) filterPanelVisible.set(false)
viewModel.searchClick() viewModel.searchClick()
} }
/** 手机版卡片内「提前运抵」(单票,由 ViewHolder 调用) */ /** 手机版卡片内「提前运抵」(单票,由 ViewHolder 调用) */
fun preArriveClick(bean: GjcWeighingBean) { fun preArriveClick(bean: GjcWeighingBean) {
viewModel.arrivedAheadSingle(bean) viewModel.arrivedAheadSingle(bean)
} }
companion object { companion object {
@JvmStatic @JvmStatic
fun start(context: Context) { fun start(context: Context) {
val starter = Intent(context, GjcWeighingListActivity::class.java) val starter = Intent(context, GjcWeighingListActivity::class.java)
context.startActivity(starter) context.startActivity(starter)
} }
} }
} }

View File

@@ -1,103 +1,104 @@
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 androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordDetailsBinding import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordDetailsBinding
import com.lukouguoji.gjc.holder.GjcCheckInRecordViewHolder import com.lukouguoji.gjc.holder.GjcCheckInRecordViewHolder
import com.lukouguoji.gjc.viewModel.GjcWeighingRecordDetailsViewModel import com.lukouguoji.gjc.viewModel.GjcWeighingRecordDetailsViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.base.CommonAdapter import com.lukouguoji.module_base.base.CommonAdapter
import com.lukouguoji.module_base.bean.GjcCheckInRecord import com.lukouguoji.module_base.bean.GjcCheckInRecord
import com.lukouguoji.module_base.bean.GjcWeighingRecordBean import com.lukouguoji.module_base.bean.GjcWeighingRecordBean
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil
/**
* 国际出港计重明细页 /**
* * 国际出港计重明细页
* 布局 id 不区分设备,平板/手机由资源限定符自动选择: *
* layout-sw600dp/activity_gjc_weighing_record_details.xml平板列表内联编辑 * 布局 id 不区分设备,平板/手机由资源限定符自动选择:
* layout/activity_gjc_weighing_record_details.xml手机,单条记录经全屏「修改记录」覆层编辑) * layout-sw600dp/activity_gjc_weighing_record_details.xml平板,列表内联编辑)
*/ * layout/activity_gjc_weighing_record_details.xml手机单条记录经全屏「修改记录」覆层编辑
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_DETAILS) */
class GjcWeighingRecordDetailsActivity : @Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_DETAILS)
BaseBindingActivity<ActivityGjcWeighingRecordDetailsBinding, GjcWeighingRecordDetailsViewModel>() { class GjcWeighingRecordDetailsActivity :
BaseBindingActivity<ActivityGjcWeighingRecordDetailsBinding, GjcWeighingRecordDetailsViewModel>() {
private lateinit var adapter: CommonAdapter
private lateinit var adapter: CommonAdapter
// 当前编辑模式供ViewHolder获取
var currentEditMode = false // 当前编辑模式供ViewHolder获取
var currentEditMode = false
override fun layoutId() = R.layout.activity_gjc_weighing_record_details
override fun layoutId() = R.layout.activity_gjc_weighing_record_details
override fun viewModelClass() = GjcWeighingRecordDetailsViewModel::class.java
override fun viewModelClass() = GjcWeighingRecordDetailsViewModel::class.java
override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港计重明细") override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow(if (DeviceUtil.isPhone()) "计重明细" else "国际出港计重明细")
binding.viewModel = viewModel
binding.viewModel = viewModel
// 初始化RecyclerView
val layoutManager = LinearLayoutManager(this) // 初始化RecyclerView
binding.recyclerView.layoutManager = layoutManager val layoutManager = LinearLayoutManager(this)
binding.recyclerView.layoutManager = layoutManager
// 添加分割线
val divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL) // 添加分割线
binding.recyclerView.addItemDecoration(divider) val divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
binding.recyclerView.addItemDecoration(divider)
adapter = CommonAdapter(
this, adapter = CommonAdapter(
R.layout.item_gjc_check_in_record, this,
GjcCheckInRecordViewHolder::class.java R.layout.item_gjc_check_in_record,
) GjcCheckInRecordViewHolder::class.java
binding.recyclerView.adapter = adapter )
binding.recyclerView.adapter = adapter
// 监听数据变化更新RecyclerView
viewModel.recordList.observe(this) { records -> // 监听数据变化更新RecyclerView
adapter.refresh(records) viewModel.recordList.observe(this) { records ->
} adapter.refresh(records)
}
// 监听编辑模式变化,更新当前编辑模式并刷新列表
viewModel.isEditMode.observe(this) { isEditMode -> // 监听编辑模式变化,更新当前编辑模式并刷新列表
// 更新当前编辑模式状态 viewModel.isEditMode.observe(this) { isEditMode ->
currentEditMode = isEditMode // 更新当前编辑模式状态
currentEditMode = isEditMode
// 刷新所有可见的 ViewHolder
adapter.notifyDataSetChanged() // 刷新所有可见的 ViewHolder
} adapter.notifyDataSetChanged()
}
// 初始化数据
viewModel.initOnCreated(intent) // 初始化数据
} viewModel.initOnCreated(intent)
}
// ==================== 手机版专用交互(纯 UI复用既有 ViewModel 编辑链路) ====================
// ==================== 手机版专用交互(纯 UI复用既有 ViewModel 编辑链路) ====================
/**
* 手机版:打开「修改记录」覆层编辑指定记录。 /**
* 复用 [GjcWeighingRecordDetailsViewModel.onModifyClick] 的备份/编辑态逻辑, * 手机版:打开「修改记录」覆层编辑指定记录。
* 覆层显隐由 isEditMode 驱动(平板端该状态驱动列表内联编辑,互不影响)。 * 复用 [GjcWeighingRecordDetailsViewModel.onModifyClick] 的备份/编辑态逻辑,
*/ * 覆层显隐由 isEditMode 驱动(平板端该状态驱动列表内联编辑,互不影响)。
fun openPhoneEdit(record: GjcCheckInRecord) { */
viewModel.onModifyClick() fun openPhoneEdit(record: GjcCheckInRecord) {
binding.editRecord = record viewModel.onModifyClick()
} binding.editRecord = record
}
/** 手机版:取消编辑(恢复备份并收起覆层) */
fun closePhoneEdit() { /** 手机版:取消编辑(恢复备份并收起覆层) */
viewModel.onCancelClick() fun closePhoneEdit() {
} viewModel.onCancelClick()
}
companion object {
@JvmStatic companion object {
fun start(context: Context, bean: GjcWeighingRecordBean) { @JvmStatic
val starter = Intent(context, GjcWeighingRecordDetailsActivity::class.java) fun start(context: Context, bean: GjcWeighingRecordBean) {
.putExtra(Constant.Key.BEAN, bean) val starter = Intent(context, GjcWeighingRecordDetailsActivity::class.java)
context.startActivity(starter) .putExtra(Constant.Key.BEAN, bean)
} context.startActivity(starter)
} }
} }
}

View File

@@ -1,99 +1,99 @@
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 androidx.databinding.ObservableBoolean import androidx.databinding.ObservableBoolean
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordListBinding import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordListBinding
import com.lukouguoji.gjc.viewModel.GjcWeighingRecordViewModel import com.lukouguoji.gjc.viewModel.GjcWeighingRecordViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.common.ConstantEvent import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.impl.FlowBus import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.impl.observe
import com.lukouguoji.module_base.ktx.getLifecycleOwner import com.lukouguoji.module_base.ktx.getLifecycleOwner
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil import com.lukouguoji.module_base.util.DeviceUtil
/** /**
* 国际出港计重记录列表页 * 国际出港计重记录列表页
* *
* 布局 id 不区分设备,平板/手机由资源限定符自动选择: * 布局 id 不区分设备,平板/手机由资源限定符自动选择:
* layout-sw600dp/activity_gjc_weighing_record_list.xml平板 * layout-sw600dp/activity_gjc_weighing_record_list.xml平板
* layout/activity_gjc_weighing_record_list.xml手机 * layout/activity_gjc_weighing_record_list.xml手机
*/ */
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) @Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST)
class GjcWeighingRecordListActivity : class GjcWeighingRecordListActivity :
BaseBindingActivity<ActivityGjcWeighingRecordListBinding, GjcWeighingRecordViewModel>() { BaseBindingActivity<ActivityGjcWeighingRecordListBinding, GjcWeighingRecordViewModel>() {
override fun layoutId() = R.layout.activity_gjc_weighing_record_list override fun layoutId() = R.layout.activity_gjc_weighing_record_list
override fun viewModelClass() = GjcWeighingRecordViewModel::class.java override fun viewModelClass() = GjcWeighingRecordViewModel::class.java
/** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */
val filterPanelVisible = ObservableBoolean(false) val filterPanelVisible = ObservableBoolean(false)
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港计重记录") setBackArrow(if (DeviceUtil.isPhone()) "计重记录" else "国际出港计重记录")
binding.viewModel = viewModel binding.viewModel = viewModel
binding.activity = this binding.activity = this
// 手机版专属数据:放开默认日期、加载计重人下拉 // 手机版专属数据:放开默认日期、加载计重人下拉
// 平板端不调用,查询链路与请求次数与改造前完全一致 // 平板端不调用,查询链路与请求次数与改造前完全一致
if (DeviceUtil.isPhone()) { if (DeviceUtil.isPhone()) {
viewModel.initPhoneExtras() viewModel.initPhoneExtras()
} }
// 初始化代理人列表 // 初始化代理人列表
viewModel.initAgentList() viewModel.initAgentList()
// 初始化特码列表 // 初始化特码列表
viewModel.initSpecialCodeList() viewModel.initSpecialCodeList()
// 绑定分页逻辑 // 绑定分页逻辑
viewModel.pageModel viewModel.pageModel
.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner())
// 监听刷新事件 // 监听刷新事件
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH) FlowBus.with<String>(ConstantEvent.EVENT_REFRESH)
.observe(this) { .observe(this) {
viewModel.refresh() viewModel.refresh()
} }
// 初始加载 // 初始加载
viewModel.refresh() viewModel.refresh()
} }
// ==================== 手机版专用交互(纯 UI复用既有 ViewModel 字段) ==================== // ==================== 手机版专用交互(纯 UI复用既有 ViewModel 字段) ====================
/** 手机版筛选弹层显隐切换 */ /** 手机版筛选弹层显隐切换 */
fun toggleFilterPanel() { fun toggleFilterPanel() {
filterPanelVisible.set(!filterPanelVisible.get()) filterPanelVisible.set(!filterPanelVisible.get())
} }
/** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */ /** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */
fun resetFilter() { fun resetFilter() {
viewModel.checkInDateStart.value = "" viewModel.checkInDateStart.value = ""
viewModel.checkInDateEnd.value = "" viewModel.checkInDateEnd.value = ""
viewModel.agentCode.value = "" viewModel.agentCode.value = ""
viewModel.spCode.value = "" viewModel.spCode.value = ""
viewModel.destFilter.value = "" viewModel.destFilter.value = ""
viewModel.opUserFilter.value = "" viewModel.opUserFilter.value = ""
} }
/** 手机版筛选:确认 */ /** 手机版筛选:确认 */
fun confirmFilter() { fun confirmFilter() {
filterPanelVisible.set(false) filterPanelVisible.set(false)
viewModel.searchClick() viewModel.searchClick()
} }
companion object { companion object {
@JvmStatic @JvmStatic
fun start(context: Context) { fun start(context: Context) {
val starter = Intent(context, GjcWeighingRecordListActivity::class.java) val starter = Intent(context, GjcWeighingRecordListActivity::class.java)
context.startActivity(starter) context.startActivity(starter)
} }
} }
} }

View File

@@ -1,221 +1,221 @@
package com.lukouguoji.gjc.activity package com.lukouguoji.gjc.activity
import android.animation.Animator import android.animation.Animator
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet import android.animation.AnimatorSet
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
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 android.view.View import android.view.View
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityGjcWeighingStartBinding import com.lukouguoji.gjc.databinding.ActivityGjcWeighingStartBinding
import com.lukouguoji.gjc.viewModel.GjcWeighingStartViewModel import com.lukouguoji.gjc.viewModel.GjcWeighingStartViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil import com.lukouguoji.module_base.util.DeviceUtil
/** /**
* 国际出港计重-开始计重页面 * 国际出港计重-开始计重页面
*/ */
@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_START) @Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_START)
class GjcWeighingStartActivity : class GjcWeighingStartActivity :
BaseBindingActivity<ActivityGjcWeighingStartBinding, GjcWeighingStartViewModel>() { BaseBindingActivity<ActivityGjcWeighingStartBinding, GjcWeighingStartViewModel>() {
private var isExpanded = false private var isExpanded = false
override fun layoutId() = R.layout.activity_gjc_weighing_start override fun layoutId() = R.layout.activity_gjc_weighing_start
override fun viewModelClass() = GjcWeighingStartViewModel::class.java override fun viewModelClass() = GjcWeighingStartViewModel::class.java
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港开始计重") setBackArrow(if (DeviceUtil.isPhone()) "开始计重" else "国际出港开始计重")
binding.viewModel = viewModel binding.viewModel = viewModel
// 手机版专属:提交体携带托盘数量/托盘自重(平板不调用,请求体与改造前完全一致) // 手机版专属:提交体携带托盘数量/托盘自重(平板不调用,请求体与改造前完全一致)
if (DeviceUtil.isPhone()) { if (DeviceUtil.isPhone()) {
viewModel.initPhoneExtras() viewModel.initPhoneExtras()
} }
viewModel.initOnCreated(this, intent) viewModel.initOnCreated(this, intent)
setupFloatButtons() setupFloatButtons()
} }
private fun setupFloatButtons() { private fun setupFloatButtons() {
// 浮动按钮组仅平板布局存在layout-sw600dp手机布局无这些 id直接跳过 // 浮动按钮组仅平板布局存在layout-sw600dp手机布局无这些 id直接跳过
val mainFloatButton = binding.mainFloatButton ?: return val mainFloatButton = binding.mainFloatButton ?: return
val maskView = binding.maskView ?: return val maskView = binding.maskView ?: return
val subButton1 = binding.subButton1 ?: return val subButton1 = binding.subButton1 ?: return
val subButton2 = binding.subButton2 ?: return val subButton2 = binding.subButton2 ?: return
// 主按钮点击事件 // 主按钮点击事件
mainFloatButton.setOnClickListener { mainFloatButton.setOnClickListener {
if (!isExpanded) { if (!isExpanded) {
expandButtons() expandButtons()
} }
} }
// 遮罩层点击事件 // 遮罩层点击事件
maskView.setOnClickListener { maskView.setOnClickListener {
collapseButtons() collapseButtons()
} }
// 子按钮1点击事件 - 跳转到出港运抵页面 // 子按钮1点击事件 - 跳转到出港运抵页面
subButton1.setOnClickListener { subButton1.setOnClickListener {
com.alibaba.android.arouter.launcher.ARouter.getInstance() com.alibaba.android.arouter.launcher.ARouter.getInstance()
.build(ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) .build(ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE)
.navigation() .navigation()
collapseButtons() collapseButtons()
} }
// 子按钮2点击事件 - 跳转到计重记录 // 子按钮2点击事件 - 跳转到计重记录
subButton2.setOnClickListener { subButton2.setOnClickListener {
com.alibaba.android.arouter.launcher.ARouter.getInstance() com.alibaba.android.arouter.launcher.ARouter.getInstance()
.build(ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) .build(ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST)
.navigation() .navigation()
collapseButtons() collapseButtons()
} }
} }
/** /**
* 展开子按钮(仅平板,手机布局无浮动按钮组) * 展开子按钮(仅平板,手机布局无浮动按钮组)
*/ */
private fun expandButtons() { private fun expandButtons() {
val mainFloatButton = binding.mainFloatButton ?: return val mainFloatButton = binding.mainFloatButton ?: return
val maskView = binding.maskView ?: return val maskView = binding.maskView ?: return
val subButton1 = binding.subButton1 ?: return val subButton1 = binding.subButton1 ?: return
val subButton2 = binding.subButton2 ?: return val subButton2 = binding.subButton2 ?: return
isExpanded = true isExpanded = true
// 显示遮罩层 // 显示遮罩层
maskView.visibility = View.VISIBLE maskView.visibility = View.VISIBLE
maskView.alpha = 0f maskView.alpha = 0f
maskView.animate().alpha(0.3f).setDuration(200).start() maskView.animate().alpha(0.3f).setDuration(200).start()
// 显示子按钮 // 显示子按钮
subButton1.visibility = View.VISIBLE subButton1.visibility = View.VISIBLE
subButton2.visibility = View.VISIBLE subButton2.visibility = View.VISIBLE
// 子按钮1动画向左上方移动: 左移15dp, 上移55dp // 子按钮1动画向左上方移动: 左移15dp, 上移55dp
val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", 0f, -5f) val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", 0f, -5f)
val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", 0f, -25f) val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", 0f, -25f)
val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 0f, 1f) val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 0f, 1f)
val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 0f, 1f) val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 0f, 1f)
val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 0f, 1f) val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 0f, 1f)
val animSet1 = AnimatorSet() val animSet1 = AnimatorSet()
animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY)
animSet1.duration = 200 animSet1.duration = 200
// 子按钮2动画向左下方移动: 左移55dp, 下移15dp // 子按钮2动画向左下方移动: 左移55dp, 下移15dp
val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", 0f, -25f) val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", 0f, -25f)
val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", 0f, -5f) val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", 0f, -5f)
val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 0f, 1f) val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 0f, 1f)
val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 0f, 1f) val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 0f, 1f)
val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 0f, 1f) val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 0f, 1f)
val animSet2 = AnimatorSet() val animSet2 = AnimatorSet()
animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY)
animSet2.duration = 200 animSet2.duration = 200
animSet2.startDelay = 50 animSet2.startDelay = 50
// 主按钮隐藏动画 // 主按钮隐藏动画
mainFloatButton.animate() mainFloatButton.animate()
.scaleX(0f) .scaleX(0f)
.scaleY(0f) .scaleY(0f)
.alpha(0f) .alpha(0f)
.setDuration(150) .setDuration(150)
.setListener(object : AnimatorListenerAdapter() { .setListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
mainFloatButton.visibility = View.GONE mainFloatButton.visibility = View.GONE
} }
}) })
.start() .start()
animSet1.start() animSet1.start()
animSet2.start() animSet2.start()
} }
/** /**
* 收起子按钮(仅平板,手机布局无浮动按钮组) * 收起子按钮(仅平板,手机布局无浮动按钮组)
*/ */
private fun collapseButtons() { private fun collapseButtons() {
val mainFloatButton = binding.mainFloatButton ?: return val mainFloatButton = binding.mainFloatButton ?: return
val maskView = binding.maskView ?: return val maskView = binding.maskView ?: return
val subButton1 = binding.subButton1 ?: return val subButton1 = binding.subButton1 ?: return
val subButton2 = binding.subButton2 ?: return val subButton2 = binding.subButton2 ?: return
isExpanded = false isExpanded = false
// 隐藏遮罩层 // 隐藏遮罩层
maskView.animate().alpha(0f).setDuration(200).withEndAction { maskView.animate().alpha(0f).setDuration(200).withEndAction {
maskView.visibility = View.GONE maskView.visibility = View.GONE
}.start() }.start()
// 子按钮1动画回到原位 // 子按钮1动画回到原位
val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", subButton1.translationX, 0f) val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", subButton1.translationX, 0f)
val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", subButton1.translationY, 0f) val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", subButton1.translationY, 0f)
val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 1f, 0f) val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 1f, 0f)
val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 1f, 0f) val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 1f, 0f)
val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 1f, 0f) val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 1f, 0f)
val animSet1 = AnimatorSet() val animSet1 = AnimatorSet()
animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY)
animSet1.duration = 200 animSet1.duration = 200
// 子按钮2动画回到原位 // 子按钮2动画回到原位
val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", subButton2.translationX, 0f) val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", subButton2.translationX, 0f)
val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", subButton2.translationY, 0f) val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", subButton2.translationY, 0f)
val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 1f, 0f) val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 1f, 0f)
val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 1f, 0f) val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 1f, 0f)
val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 1f, 0f) val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 1f, 0f)
val animSet2 = AnimatorSet() val animSet2 = AnimatorSet()
animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY)
animSet2.duration = 200 animSet2.duration = 200
animSet1.addListener(object : AnimatorListenerAdapter() { animSet1.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
subButton1.visibility = View.GONE subButton1.visibility = View.GONE
} }
}) })
animSet2.addListener(object : AnimatorListenerAdapter() { animSet2.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
subButton2.visibility = View.GONE subButton2.visibility = View.GONE
} }
}) })
// 主按钮显示动画 // 主按钮显示动画
mainFloatButton.visibility = View.VISIBLE mainFloatButton.visibility = View.VISIBLE
mainFloatButton.animate() mainFloatButton.animate()
.scaleX(1f) .scaleX(1f)
.scaleY(1f) .scaleY(1f)
.alpha(1f) .alpha(1f)
.setDuration(200) .setDuration(200)
.setStartDelay(100) .setStartDelay(100)
.setListener(null) .setListener(null)
.start() .start()
animSet1.start() animSet1.start()
animSet2.start() animSet2.start()
} }
companion object { companion object {
/** /**
* 启动开始计重页面 * 启动开始计重页面
* @param context 上下文 * @param context 上下文
* @param maWbId 运单ID默认为0新增模式 * @param maWbId 运单ID默认为0新增模式
*/ */
@JvmStatic @JvmStatic
fun startForAdd(context: Context, maWbId: Long = 0) { fun startForAdd(context: Context, maWbId: Long = 0) {
val starter = Intent(context, GjcWeighingStartActivity::class.java) val starter = Intent(context, GjcWeighingStartActivity::class.java)
.putExtra(Constant.Key.MAWB_ID, maWbId) .putExtra(Constant.Key.MAWB_ID, maWbId)
context.startActivity(starter) context.startActivity(starter)
} }
} }
} }

View File

@@ -1,177 +1,177 @@
package com.lukouguoji.gjc.activity package com.lukouguoji.gjc.activity
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.databinding.ObservableBoolean import androidx.databinding.ObservableBoolean
import com.alibaba.android.arouter.facade.annotation.Autowired import com.alibaba.android.arouter.facade.annotation.Autowired
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityIntExpArriveBinding import com.lukouguoji.gjc.databinding.ActivityIntExpArriveBinding
import com.lukouguoji.gjc.viewModel.IntExpArriveViewModel import com.lukouguoji.gjc.viewModel.IntExpArriveViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.bean.GjcHaWb import com.lukouguoji.module_base.bean.GjcHaWb
import com.lukouguoji.module_base.bean.GjcMaWb import com.lukouguoji.module_base.bean.GjcMaWb
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.common.ConstantEvent import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.impl.FlowBus import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.impl.observe
import com.lukouguoji.module_base.ktx.addOnItemClickListener import com.lukouguoji.module_base.ktx.addOnItemClickListener
import com.lukouguoji.module_base.ktx.commonAdapter import com.lukouguoji.module_base.ktx.commonAdapter
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil import com.lukouguoji.module_base.util.DeviceUtil
import java.util.ArrayList import java.util.ArrayList
/** /**
* 国际出港-出港运抵页面 * 国际出港-出港运抵页面
* *
* 布局 id 不区分设备,平板/手机由资源限定符自动选择: * 布局 id 不区分设备,平板/手机由资源限定符自动选择:
* layout-sw600dp/activity_int_exp_arrive.xml平板 * layout-sw600dp/activity_int_exp_arrive.xml平板
* layout/activity_int_exp_arrive.xml手机 * layout/activity_int_exp_arrive.xml手机
*/ */
@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) @Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE)
class IntExpArriveActivity : class IntExpArriveActivity :
BaseBindingActivity<ActivityIntExpArriveBinding, IntExpArriveViewModel>() { BaseBindingActivity<ActivityIntExpArriveBinding, IntExpArriveViewModel>() {
@JvmField @JvmField
@Autowired @Autowired
var wbNoParam: String? = null var wbNoParam: String? = null
override fun layoutId() = R.layout.activity_int_exp_arrive override fun layoutId() = R.layout.activity_int_exp_arrive
override fun viewModelClass() = IntExpArriveViewModel::class.java override fun viewModelClass() = IntExpArriveViewModel::class.java
/** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */
val filterPanelVisible = ObservableBoolean(false) val filterPanelVisible = ObservableBoolean(false)
/** 供 [com.lukouguoji.gjc.holder.IntExpArriveViewHolder] 绑定 item 布局的 viewModel 变量(父类 viewModel 为 protected */ /** 供 [com.lukouguoji.gjc.holder.IntExpArriveViewHolder] 绑定 item 布局的 viewModel 变量(父类 viewModel 为 protected */
val itemViewModel: IntExpArriveViewModel get() = viewModel val itemViewModel: IntExpArriveViewModel get() = viewModel
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
// 注入 ARouter 参数 // 注入 ARouter 参数
ARouter.getInstance().inject(this) ARouter.getInstance().inject(this)
setBackArrow("国际出港运抵") setBackArrow(if (DeviceUtil.isPhone()) "出港运抵" else "国际出港运抵")
binding.viewModel = viewModel binding.viewModel = viewModel
binding.activity = this binding.activity = this
// 手机版专属数据:加载「代理」筛选下拉 // 手机版专属数据:加载「代理」筛选下拉
// 平板端不调用,查询链路与请求次数与改造前完全一致 // 平板端不调用,查询链路与请求次数与改造前完全一致
if (DeviceUtil.isPhone()) { if (DeviceUtil.isPhone()) {
viewModel.initPhoneExtras() viewModel.initPhoneExtras()
} }
// 如果有传入运单号,自动填充并触发搜索 // 如果有传入运单号,自动填充并触发搜索
if (!wbNoParam.isNullOrEmpty()) { if (!wbNoParam.isNullOrEmpty()) {
viewModel.waybillNo.value = wbNoParam viewModel.waybillNo.value = wbNoParam
viewModel.searchClick() viewModel.searchClick()
} }
// 绑定分页 // 绑定分页
viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this) viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this)
// 设置item点击监听 // 设置item点击监听
binding.rv.addOnItemClickListener(viewModel) binding.rv.addOnItemClickListener(viewModel)
// 监听刷新事件 // 监听刷新事件
FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() }
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) { FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) {
viewModel.refresh() viewModel.refresh()
} }
// 初始加载数据(如果没有传入运单号,才执行初始加载) // 初始加载数据(如果没有传入运单号,才执行初始加载)
if (wbNoParam.isNullOrEmpty()) { if (wbNoParam.isNullOrEmpty()) {
viewModel.refresh() viewModel.refresh()
} }
} }
// ==================== 手机版专用交互(纯 UI复用既有 ViewModel 字段与数据) ==================== // ==================== 手机版专用交互(纯 UI复用既有 ViewModel 字段与数据) ====================
/** /**
* 手机版 Tab 切换回调PhoneStatusTab 已通过双向绑定写入 viewModel.currentTab * 手机版 Tab 切换回调PhoneStatusTab 已通过双向绑定写入 viewModel.currentTab
* 这里触发 ViewModel 把适配器数据集替换为过滤后的子集(不发起新请求)。 * 这里触发 ViewModel 把适配器数据集替换为过滤后的子集(不发起新请求)。
*/ */
fun onArriveTabChanged() { fun onArriveTabChanged() {
viewModel.onTabChangedPhone() viewModel.onTabChangedPhone()
} }
/** 卡片长按展开操作浮层View.OnLongClickListener 要求返回 Boolean */ /** 卡片长按展开操作浮层View.OnLongClickListener 要求返回 Boolean */
fun showCardActionPhone(bean: GjcMaWb): Boolean { fun showCardActionPhone(bean: GjcMaWb): Boolean {
bean.actionMenuVisible.set(true) bean.actionMenuVisible.set(true)
return true return true
} }
/** 点击浮层遮罩/空白处:收起操作浮层 */ /** 点击浮层遮罩/空白处:收起操作浮层 */
fun hideCardActionPhone(bean: GjcMaWb) { fun hideCardActionPhone(bean: GjcMaWb) {
bean.actionMenuVisible.set(false) bean.actionMenuVisible.set(false)
} }
/** 选择圈勾选状态变化后回调(由 ViewHolder 调用) */ /** 选择圈勾选状态变化后回调(由 ViewHolder 调用) */
fun onItemCheckChanged() { fun onItemCheckChanged() {
viewModel.onItemCheckChanged() viewModel.onItemCheckChanged()
} }
/** 手机版筛选弹层显隐切换 */ /** 手机版筛选弹层显隐切换 */
fun toggleFilterPanel() { fun toggleFilterPanel() {
filterPanelVisible.set(!filterPanelVisible.get()) filterPanelVisible.set(!filterPanelVisible.get())
} }
/** 手机版筛选:重置 */ /** 手机版筛选:重置 */
fun resetFilter() { fun resetFilter() {
viewModel.flightDate.value = "" viewModel.flightDate.value = ""
viewModel.flightNo.value = "" viewModel.flightNo.value = ""
viewModel.agentCodePhone.value = "" viewModel.agentCodePhone.value = ""
} }
/** 手机版筛选:确认 */ /** 手机版筛选:确认 */
fun confirmFilter() { fun confirmFilter() {
filterPanelVisible.set(false) filterPanelVisible.set(false)
viewModel.searchClick() viewModel.searchClick()
} }
/** /**
* 进入「分单明细」页:直接传递该运单已加载的 haWbList零新增请求。 * 进入「分单明细」页:直接传递该运单已加载的 haWbList零新增请求。
*/ */
fun openSubOrder(bean: GjcMaWb) { fun openSubOrder(bean: GjcMaWb) {
val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty()) val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty())
IntExpArriveSubOrderActivity.start(this, bean.wbNo.orEmpty(), list) IntExpArriveSubOrderActivity.start(this, bean.wbNo.orEmpty(), list)
} }
/** /**
* 进入「回执」页(手机专属只读页):复用 haWbList[].response + arrivalOpDate零新增请求。 * 进入「回执」页(手机专属只读页):复用 haWbList[].response + arrivalOpDate零新增请求。
*/ */
fun openReceipt(bean: GjcMaWb) { fun openReceipt(bean: GjcMaWb) {
bean.actionMenuVisible.set(false) bean.actionMenuVisible.set(false)
val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty()) val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty())
IntExpArriveReceiptActivity.start(this, bean.wbNo.orEmpty(), list) IntExpArriveReceiptActivity.start(this, bean.wbNo.orEmpty(), list)
} }
/** /**
* 进入「补充信息」页(手机专属新页):对该运单整个 haWbList 批量应用(参照 Pad 端国际进港 * 进入「补充信息」页(手机专属新页):对该运单整个 haWbList 批量应用(参照 Pad 端国际进港
* IntArrSupplementInfoViewModel 的批量复制模式)。后端暂无保存接口,见接口问题清单。 * IntArrSupplementInfoViewModel 的批量复制模式)。后端暂无保存接口,见接口问题清单。
*/ */
fun openSupplement(bean: GjcMaWb) { fun openSupplement(bean: GjcMaWb) {
bean.actionMenuVisible.set(false) bean.actionMenuVisible.set(false)
val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty()) val list = ArrayList<GjcHaWb>(bean.haWbList.orEmpty())
IntExpArriveSupplementActivity.start(this, bean.wbNo.orEmpty(), list) IntExpArriveSupplementActivity.start(this, bean.wbNo.orEmpty(), list)
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
when (requestCode) { when (requestCode) {
Constant.RequestCode.WAYBILL -> { Constant.RequestCode.WAYBILL -> {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
viewModel.waybillNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) viewModel.waybillNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT)
viewModel.searchClick() viewModel.searchClick()
} }
} }
Constant.RequestCode.CODE -> { Constant.RequestCode.CODE -> {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
viewModel.hno.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) viewModel.hno.value = data?.getStringExtra(Constant.Result.CODED_CONTENT)
viewModel.searchClick() viewModel.searchClick()
} }
} }
} }
} }
} }

View File

@@ -35,7 +35,7 @@ class IntExpOutHandoverActivity :
val filterPanelVisible = ObservableBoolean(false) val filterPanelVisible = ObservableBoolean(false)
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港出库交接") setBackArrow(if (DeviceUtil.isPhone()) "出库交接" else "国际出港出库交接")
binding.viewModel = viewModel binding.viewModel = viewModel
binding.activity = this binding.activity = this

View File

@@ -1,171 +1,171 @@
package com.lukouguoji.gjc.page.move package com.lukouguoji.gjc.page.move
import android.app.Activity import android.app.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 androidx.databinding.ObservableBoolean import androidx.databinding.ObservableBoolean
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.lukouguoji.gjc.R import com.lukouguoji.gjc.R
import com.lukouguoji.gjc.databinding.ActivityIntExpMoveBinding import com.lukouguoji.gjc.databinding.ActivityIntExpMoveBinding
import com.lukouguoji.gjc.viewModel.IntExpMoveViewModel import com.lukouguoji.gjc.viewModel.IntExpMoveViewModel
import com.lukouguoji.module_base.base.BaseBindingActivity import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.common.ConstantEvent import com.lukouguoji.module_base.common.ConstantEvent
import com.lukouguoji.module_base.impl.FlowBus import com.lukouguoji.module_base.impl.FlowBus
import com.lukouguoji.module_base.impl.observe import com.lukouguoji.module_base.impl.observe
import com.lukouguoji.module_base.ktx.addOnItemClickListener import com.lukouguoji.module_base.ktx.addOnItemClickListener
import com.lukouguoji.module_base.ktx.showToast import com.lukouguoji.module_base.ktx.showToast
import com.lukouguoji.module_base.model.ConfirmDialogModel import com.lukouguoji.module_base.model.ConfirmDialogModel
import com.lukouguoji.module_base.model.ScanModel import com.lukouguoji.module_base.model.ScanModel
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil import com.lukouguoji.module_base.util.DeviceUtil
/** /**
* 国际出港-出港移库 * 国际出港-出港移库
*/ */
@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_MOVE) @Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_MOVE)
class IntExpMoveActivity : BaseBindingActivity<ActivityIntExpMoveBinding, IntExpMoveViewModel>() { class IntExpMoveActivity : BaseBindingActivity<ActivityIntExpMoveBinding, IntExpMoveViewModel>() {
// 布局 id 不区分设备,平板/手机由资源限定符自动选择: // 布局 id 不区分设备,平板/手机由资源限定符自动选择:
// layout-sw600dp/activity_int_exp_move.xml平板 / layout/activity_int_exp_move.xml手机 // layout-sw600dp/activity_int_exp_move.xml平板 / layout/activity_int_exp_move.xml手机
override fun layoutId() = R.layout.activity_int_exp_move override fun layoutId() = R.layout.activity_int_exp_move
override fun viewModelClass() = IntExpMoveViewModel::class.java override fun viewModelClass() = IntExpMoveViewModel::class.java
/** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */
val filterPanelVisible = ObservableBoolean(false) val filterPanelVisible = ObservableBoolean(false)
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际出港移库") setBackArrow(if (DeviceUtil.isPhone()) "出港移库" else "国际出港移库")
binding.viewModel = viewModel binding.viewModel = viewModel
binding.activity = this binding.activity = this
// 手机版专属数据默认「待移库」Tab、Tab 角标计数、特码下拉 // 手机版专属数据默认「待移库」Tab、Tab 角标计数、特码下拉
// 平板端不调用,查询链路与请求次数与改造前完全一致 // 平板端不调用,查询链路与请求次数与改造前完全一致
if (DeviceUtil.isPhone()) { if (DeviceUtil.isPhone()) {
viewModel.initPhoneExtras() viewModel.initPhoneExtras()
} }
initRecyclerView() initRecyclerView()
initListeners() initListeners()
observeData() observeData()
} }
/** /**
* 初始化RecyclerView * 初始化RecyclerView
*/ */
private fun initRecyclerView() { private fun initRecyclerView() {
viewModel.pageModel.bindSmartRefreshLayout( viewModel.pageModel.bindSmartRefreshLayout(
binding.srl, binding.srl,
binding.rv, binding.rv,
viewModel, viewModel,
this this
) )
binding.rv.addOnItemClickListener(viewModel) binding.rv.addOnItemClickListener(viewModel)
} }
/** /**
* 初始化监听器 * 初始化监听器
*/ */
private fun initListeners() { private fun initListeners() {
// 移库按钮btnMove 只存在于平板变体(手机版底部条走 setOnActionClick故判空 // 移库按钮btnMove 只存在于平板变体(手机版底部条走 setOnActionClick故判空
binding.btnMove?.setOnClickListener { binding.btnMove?.setOnClickListener {
showMoveConfirmDialog() showMoveConfirmDialog()
} }
} }
/** /**
* 观察数据变化 * 观察数据变化
*/ */
private fun observeData() { private fun observeData() {
// 监听item选择变化事件,更新全选状态 // 监听item选择变化事件,更新全选状态
FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { FlowBus.with<String>(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) {
viewModel.onItemCheckChanged() viewModel.onItemCheckChanged()
} }
// 监听刷新事件 // 监听刷新事件
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) { FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) {
viewModel.refresh() viewModel.refresh()
} }
// 初始加载数据 // 初始加载数据
viewModel.refresh() viewModel.refresh()
} }
/** /**
* 扫码运单号 * 扫码运单号
*/ */
fun scanWaybill() { fun scanWaybill() {
ScanModel.startScan(this, Constant.RequestCode.WAYBILL) ScanModel.startScan(this, Constant.RequestCode.WAYBILL)
} }
// ==================== 手机版专用交互(复用既有 ViewModel 字段,无新增业务逻辑) ==================== // ==================== 手机版专用交互(复用既有 ViewModel 字段,无新增业务逻辑) ====================
/** /**
* 手机版筛选弹层显隐切换 * 手机版筛选弹层显隐切换
*/ */
fun toggleFilterPanel() { fun toggleFilterPanel() {
filterPanelVisible.set(!filterPanelVisible.get()) filterPanelVisible.set(!filterPanelVisible.get())
} }
/** /**
* 手机版筛选:重置 * 手机版筛选:重置
* *
* 只清空弹层内的三个条件(承运人 / 运单类型 / 特码),不影响 Tab 与顶部搜索框。 * 只清空弹层内的三个条件(承运人 / 运单类型 / 特码),不影响 Tab 与顶部搜索框。
*/ */
fun resetFilter() { fun resetFilter() {
viewModel.by1.value = "" viewModel.by1.value = ""
viewModel.awbType.value = "" viewModel.awbType.value = ""
viewModel.spCode.value = "" viewModel.spCode.value = ""
} }
/** /**
* 手机版筛选:确定 * 手机版筛选:确定
*/ */
fun confirmFilter() { fun confirmFilter() {
filterPanelVisible.set(false) filterPanelVisible.set(false)
viewModel.searchClick() viewModel.searchClick()
} }
/** /**
* 显示移库确认对话框 * 显示移库确认对话框
* *
* 手机版底部操作条通过 XML 的 setOnActionClick 调用,故为 public。 * 手机版底部操作条通过 XML 的 setOnActionClick 调用,故为 public。
*/ */
fun showMoveConfirmDialog() { fun showMoveConfirmDialog() {
val selectedItems = viewModel.getSelectedItems() val selectedItems = viewModel.getSelectedItems()
if (selectedItems.isEmpty()) { if (selectedItems.isEmpty()) {
showToast("请至少选择一条运单") showToast("请至少选择一条运单")
return return
} }
ConfirmDialogModel( ConfirmDialogModel(
message = "确定要移库选中的 ${selectedItems.size} 条运单吗?", message = "确定要移库选中的 ${selectedItems.size} 条运单吗?",
title = "移库确认" title = "移库确认"
) { ) {
viewModel.submitMove() viewModel.submitMove()
}.show() }.show()
} }
/** /**
* 扫码回调 * 扫码回调
*/ */
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) { if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) {
val code = data?.getStringExtra(Constant.Result.CODED_CONTENT) val code = data?.getStringExtra(Constant.Result.CODED_CONTENT)
viewModel.waybillNo.value = code viewModel.waybillNo.value = code
viewModel.searchClick() viewModel.searchClick()
} }
} }
companion object { companion object {
@JvmStatic @JvmStatic
fun start(context: Context) { fun start(context: Context) {
val starter = Intent(context, IntExpMoveActivity::class.java) val starter = Intent(context, IntExpMoveActivity::class.java)
context.startActivity(starter) context.startActivity(starter)
} }
} }
} }

View File

@@ -75,23 +75,51 @@
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text='@{"日期: " + bean.fdate}' android:gravity="center_vertical"
android:textColor="@color/phone_text_body" android:orientation="horizontal">
android:textSize="13sp"
tools:text="日期: 20260721" />
<TextView <ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:src="@drawable/ic_phone_airplane" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:text='@{"日期: " + bean.fdate}'
android:textColor="@color/phone_text_body"
android:textSize="13sp"
tools:text="日期: 20260721" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text='@{"航程: " + bean.range}' android:gravity="center_vertical"
android:textColor="@color/phone_text_body" android:orientation="horizontal">
android:textSize="13sp"
tools:text="航程: HFE-LAX" /> <ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:src="@drawable/ic_phone_location" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:text='@{"航程: " + bean.range}'
android:textColor="@color/phone_text_body"
android:textSize="13sp"
tools:text="航程: HFE-LAX" />
</LinearLayout>
</LinearLayout> </LinearLayout>
@@ -102,23 +130,54 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text='@{"代理: " + bean.agentName}' android:gravity="center_vertical"
android:textColor="@color/phone_text_body" android:orientation="horizontal">
android:textSize="13sp"
tools:text="代理: 中外运" />
<TextView <ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:src="@drawable/ic_phone_person" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text='@{"代理: " + bean.agentName}'
android:textColor="@color/phone_text_body"
android:textSize="13sp"
tools:text="代理: 中外运" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text='@{"特码: " + bean.spCode}' android:gravity="center_vertical"
android:textColor="@color/phone_text_body" android:orientation="horizontal">
android:textSize="13sp"
tools:text="特码: DGR" /> <ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:src="@drawable/ic_phone_tag" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:text='@{"特码: " + bean.spCode}'
android:textColor="@color/phone_text_body"
android:textSize="13sp"
tools:text="特码: DGR" />
</LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -56,14 +56,28 @@
</LinearLayout> </LinearLayout>
<!-- 代理 --> <!-- 代理 -->
<TextView <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:text='@{"代理: " + bean.agentName}' android:gravity="center_vertical"
android:textColor="@color/phone_text_body" android:orientation="horizontal">
android:textSize="13sp"
tools:text="代理: 马道" /> <ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:src="@drawable/ic_phone_person" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:text='@{"代理: " + bean.agentName}'
android:textColor="@color/phone_text_body"
android:textSize="13sp"
tools:text="代理: 马道" />
</LinearLayout>
<!-- 运抵统计框 --> <!-- 运抵统计框 -->
<com.lukouguoji.module_base.ui.weight.phone.PhoneStatBox <com.lukouguoji.module_base.ui.weight.phone.PhoneStatBox

View File

@@ -33,7 +33,7 @@ class IntImpQueryActivity :
override fun viewModelClass() = IntImpQueryViewModel::class.java override fun viewModelClass() = IntImpQueryViewModel::class.java
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际进港查询") setBackArrow(if (DeviceUtil.isPhone()) "进港查询" else "国际进港查询")
binding.viewModel = viewModel binding.viewModel = viewModel

View File

@@ -16,6 +16,7 @@ import com.lukouguoji.module_base.base.BaseBindingActivity
import com.lukouguoji.module_base.base.CustomVP2Adapter import com.lukouguoji.module_base.base.CustomVP2Adapter
import com.lukouguoji.module_base.common.Constant import com.lukouguoji.module_base.common.Constant
import com.lukouguoji.module_base.router.ARouterConstants import com.lukouguoji.module_base.router.ARouterConstants
import com.lukouguoji.module_base.util.DeviceUtil
/** /**
* 国际进港查询详情页面 * 国际进港查询详情页面
@@ -28,7 +29,7 @@ class IntImpQueryDetailsActivity :
override fun viewModelClass() = IntImpQueryDetailsViewModel::class.java override fun viewModelClass() = IntImpQueryDetailsViewModel::class.java
override fun initOnCreate(savedInstanceState: Bundle?) { override fun initOnCreate(savedInstanceState: Bundle?) {
setBackArrow("国际进港查询详情") setBackArrow(if (DeviceUtil.isPhone()) "进港货物" else "国际进港查询详情")
binding.viewModel = viewModel binding.viewModel = viewModel
// 初始化ViewModel(传入maWbId) // 初始化ViewModel(传入maWbId)