feat: 国际进港电报解析接口对接及仓库/提取记录页面
- 电报解析:航班级联查询(自动填充目的站、始发站下拉) - 电报解析:修复接口返回格式(PageInfo 非 BaseResultBean) - 电报解析:报文类型必选校验 - 新增进港仓库、提取记录页面及菜单入口 - 修复 Spinner 空列表时 hint 不显示的问题 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -29,7 +29,7 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
@Route(path = ARouterConstants.ACTIVITY_URL_GJJ_WARE_HOUSE)
|
||||
//@Route(path = ARouterConstants.ACTIVITY_URL_GJJ_WARE_HOUSE)
|
||||
class GjjWareHouseActivity : BaseActivity(), View.OnClickListener {
|
||||
private lateinit var viewModel: GjjWareHouseListViewModel
|
||||
private val currentTitleName = "国际进港仓库管理"
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
package com.lukouguoji.gjj.activity
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.ActivityIntImpPickUpRecordBinding
|
||||
import com.lukouguoji.gjj.viewModel.IntImpPickUpRecordViewModel
|
||||
import com.lukouguoji.module_base.base.BaseBindingActivity
|
||||
import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean
|
||||
import com.lukouguoji.module_base.common.Constant
|
||||
import com.lukouguoji.module_base.common.ConstantEvent
|
||||
import com.lukouguoji.module_base.impl.FlowBus
|
||||
import com.lukouguoji.module_base.impl.observe
|
||||
import com.lukouguoji.module_base.ktx.commonAdapter
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.router.ARouterConstants
|
||||
|
||||
/**
|
||||
* 国际进港-提取记录
|
||||
*/
|
||||
@Route(path = ARouterConstants.ACTIVITY_URL_INT_IMP_PICK_UP_RECORD)
|
||||
class IntImpPickUpRecordActivity :
|
||||
BaseBindingActivity<ActivityIntImpPickUpRecordBinding, IntImpPickUpRecordViewModel>() {
|
||||
|
||||
override fun layoutId() = R.layout.activity_int_imp_pick_up_record
|
||||
override fun viewModelClass() = IntImpPickUpRecordViewModel::class.java
|
||||
|
||||
override fun initOnCreate(savedInstanceState: Bundle?) {
|
||||
setBackArrow("国际进港提取记录")
|
||||
binding.viewModel = viewModel
|
||||
binding.activity = this
|
||||
|
||||
// 观察全选状态,更新图标透明度
|
||||
viewModel.isAllChecked.observe(this) { isAllChecked ->
|
||||
binding.checkIcon.alpha = if (isAllChecked) 1.0f else 0.5f
|
||||
}
|
||||
|
||||
// 绑定分页
|
||||
viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this)
|
||||
|
||||
// 监听刷新事件
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) {
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
// 初始化下拉列表
|
||||
viewModel.initAgentList()
|
||||
viewModel.initSpecialCodeList()
|
||||
|
||||
// 初始加载数据
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除提货操作
|
||||
*/
|
||||
fun clearPickUp() {
|
||||
val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return
|
||||
val allItems = list.filterIsInstance<IntImpPickUpRecordBean>()
|
||||
|
||||
val selectedItems = allItems.filter { it.isSelected }
|
||||
|
||||
if (selectedItems.isEmpty()) {
|
||||
showToast("请选择要清除提货的记录")
|
||||
return
|
||||
}
|
||||
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle("清除提货确认")
|
||||
.setMessage("确定要清除选中的 ${selectedItems.size} 条提货记录吗?")
|
||||
.setPositiveButton("确定") { _, _ ->
|
||||
viewModel.clearPickUp(selectedItems)
|
||||
}
|
||||
.setNegativeButton("取消", null)
|
||||
.show()
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) {
|
||||
viewModel.wbNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT)
|
||||
viewModel.searchClick()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.lukouguoji.gjj.activity
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.ActivityIntImpPickUpRecordDetailsBinding
|
||||
import com.lukouguoji.gjj.viewModel.IntImpPickUpRecordDetailsViewModel
|
||||
import com.lukouguoji.module_base.base.BaseBindingActivity
|
||||
import com.lukouguoji.module_base.common.Constant
|
||||
|
||||
/**
|
||||
* 国际进港-提取详情
|
||||
*/
|
||||
class IntImpPickUpRecordDetailsActivity :
|
||||
BaseBindingActivity<ActivityIntImpPickUpRecordDetailsBinding, IntImpPickUpRecordDetailsViewModel>() {
|
||||
|
||||
override fun layoutId() = R.layout.activity_int_imp_pick_up_record_details
|
||||
override fun viewModelClass() = IntImpPickUpRecordDetailsViewModel::class.java
|
||||
|
||||
override fun initOnCreate(savedInstanceState: Bundle?) {
|
||||
setBackArrow("国际进港提取详情")
|
||||
binding.viewModel = viewModel
|
||||
viewModel.initOnCreated(intent)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun start(context: Context, id: Long) {
|
||||
val starter = Intent(context, IntImpPickUpRecordDetailsActivity::class.java)
|
||||
.putExtra(Constant.Key.ID, id)
|
||||
context.startActivity(starter)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
package com.lukouguoji.gjj.activity
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.ActivityIntImpStorageUseBinding
|
||||
import com.lukouguoji.gjj.dialog.IntImpMoveClearDialogModel
|
||||
import com.lukouguoji.gjj.dialog.IntImpModifyStorageDialogModel
|
||||
import com.lukouguoji.gjj.dialog.IntImpInStorageDialogModel
|
||||
import com.lukouguoji.gjj.viewModel.IntImpStorageUseViewModel
|
||||
import com.lukouguoji.module_base.base.BaseBindingActivity
|
||||
import com.lukouguoji.module_base.common.Constant
|
||||
import com.lukouguoji.module_base.common.ConstantEvent
|
||||
import com.lukouguoji.module_base.impl.FlowBus
|
||||
import com.lukouguoji.module_base.impl.observe
|
||||
import com.lukouguoji.module_base.ktx.commonAdapter
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.router.ARouterConstants
|
||||
|
||||
/**
|
||||
* 国际进港-仓库
|
||||
*/
|
||||
@Route(path = ARouterConstants.ACTIVITY_URL_GJJ_WARE_HOUSE)
|
||||
class IntImpStorageUseActivity :
|
||||
BaseBindingActivity<ActivityIntImpStorageUseBinding, IntImpStorageUseViewModel>() {
|
||||
|
||||
override fun layoutId() = R.layout.activity_int_imp_storage_use
|
||||
override fun viewModelClass() = IntImpStorageUseViewModel::class.java
|
||||
|
||||
override fun initOnCreate(savedInstanceState: Bundle?) {
|
||||
setBackArrow("国际进港仓库")
|
||||
binding.viewModel = viewModel
|
||||
binding.activity = this
|
||||
|
||||
// 观察全选状态,更新图标透明度
|
||||
viewModel.isAllChecked.observe(this) { isAllChecked ->
|
||||
binding.checkIcon.alpha = if (isAllChecked) 1.0f else 0.5f
|
||||
}
|
||||
|
||||
// 绑定分页
|
||||
viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this)
|
||||
|
||||
// 监听刷新事件
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).observe(this) {
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
// 初始加载数据
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示清仓操作对话框
|
||||
*/
|
||||
fun showClearDialog() {
|
||||
val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return
|
||||
val allItems = list.filterIsInstance<com.lukouguoji.module_base.bean.GjcMaWb>()
|
||||
|
||||
val maWbListForClear = allItems.mapNotNull { maWb ->
|
||||
val selectedStorageList = maWb.storageUseList?.filter { it.isSelected } ?: emptyList()
|
||||
|
||||
if (selectedStorageList.isNotEmpty() || maWb.isSelected) {
|
||||
maWb.copy(storageUseList = selectedStorageList)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
if (maWbListForClear.isEmpty()) {
|
||||
showToast("请至少选择一个库位")
|
||||
return
|
||||
}
|
||||
|
||||
IntImpMoveClearDialogModel { dialog ->
|
||||
val clearNormal = dialog.clearNormal.value ?: ""
|
||||
viewModel.performClear(clearNormal, maWbListForClear)
|
||||
}.show(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示修改库位对话框
|
||||
*/
|
||||
fun showModifyStorageDialog() {
|
||||
val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return
|
||||
val allItems = list.filterIsInstance<com.lukouguoji.module_base.bean.GjcMaWb>()
|
||||
|
||||
val selectedStorageUseList = mutableListOf<com.lukouguoji.module_base.bean.GjcStorageUse>()
|
||||
allItems.forEach { maWb ->
|
||||
maWb.storageUseList?.filter { it.isSelected }?.let { selectedStorageUseList.addAll(it) }
|
||||
}
|
||||
|
||||
when {
|
||||
selectedStorageUseList.isEmpty() -> {
|
||||
showToast("请选择要修改的库位")
|
||||
return
|
||||
}
|
||||
selectedStorageUseList.size > 1 -> {
|
||||
showToast("只能选择一个库位进行修改")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
val selectedStorage = selectedStorageUseList[0]
|
||||
|
||||
IntImpModifyStorageDialogModel { dialog ->
|
||||
val locationName = dialog.locationName
|
||||
val locationId = dialog.locationId
|
||||
viewModel.performModifyStorage(locationName, locationId, selectedStorage)
|
||||
}.show(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示出库二次确认对话框
|
||||
*/
|
||||
fun showOutStorageDialog() {
|
||||
val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return
|
||||
val allItems = list.filterIsInstance<com.lukouguoji.module_base.bean.GjcMaWb>()
|
||||
|
||||
val selectedStorageUseList = mutableListOf<com.lukouguoji.module_base.bean.GjcStorageUse>()
|
||||
allItems.forEach { maWb ->
|
||||
maWb.storageUseList?.filter { it.isSelected }?.let { selectedStorageUseList.addAll(it) }
|
||||
}
|
||||
|
||||
if (selectedStorageUseList.isEmpty()) {
|
||||
showToast("请选择要出库的库位")
|
||||
return
|
||||
}
|
||||
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle("出库确认")
|
||||
.setMessage("确定要将选中的 ${selectedStorageUseList.size} 个库位执行出库操作吗?")
|
||||
.setPositiveButton("确定") { _, _ ->
|
||||
viewModel.performOutStorage(selectedStorageUseList)
|
||||
}
|
||||
.setNegativeButton("取消", null)
|
||||
.show()
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示入库操作对话框
|
||||
*/
|
||||
fun showInStorageDialog() {
|
||||
val list = viewModel.pageModel.rv?.commonAdapter()?.items as? List<*> ?: return
|
||||
val allItems = list.filterIsInstance<com.lukouguoji.module_base.bean.GjcMaWb>()
|
||||
|
||||
val maWbListForInStorage = allItems.mapNotNull { maWb ->
|
||||
val selectedStorageList = maWb.storageUseList?.filter { it.isSelected } ?: emptyList()
|
||||
|
||||
if (selectedStorageList.isNotEmpty() || maWb.isSelected) {
|
||||
maWb.copy(storageUseList = selectedStorageList)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
if (maWbListForInStorage.isEmpty()) {
|
||||
showToast("请至少选择一个单据")
|
||||
return
|
||||
}
|
||||
|
||||
IntImpInStorageDialogModel { dialog ->
|
||||
val locationName = dialog.locationName
|
||||
val locationId = dialog.locationId
|
||||
viewModel.performInStorage(locationName, locationId, maWbListForInStorage)
|
||||
}.show(this)
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) {
|
||||
viewModel.wbNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT)
|
||||
viewModel.searchClick()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.lukouguoji.gjj.dialog
|
||||
|
||||
import android.content.Context
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.DialogIntImpInStorageBinding
|
||||
import com.lukouguoji.module_base.base.BaseDialogModel
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.ktx.launchCollect
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.ktx.verifyNullOrEmpty
|
||||
import dev.utils.app.info.KeyValue
|
||||
|
||||
/**
|
||||
* 国际进港仓库 - 入库操作对话框
|
||||
*/
|
||||
class IntImpInStorageDialogModel(
|
||||
private val callback: (IntImpInStorageDialogModel) -> Unit
|
||||
) : BaseDialogModel<DialogIntImpInStorageBinding>(DIALOG_TYPE_CENTER) {
|
||||
|
||||
// 库位列表
|
||||
val locationList = MutableLiveData<List<KeyValue>>()
|
||||
|
||||
// 选中的库位(存储的是code)
|
||||
val selectedLocationCode = MutableLiveData("")
|
||||
|
||||
// 库位ID (后端需要的code)
|
||||
var locationId: String = ""
|
||||
|
||||
// 库位名称 (后端需要的name)
|
||||
var locationName: String = ""
|
||||
|
||||
override fun layoutId(): Int {
|
||||
return R.layout.dialog_int_imp_in_storage
|
||||
}
|
||||
|
||||
override fun onDialogCreated(context: Context) {
|
||||
binding.model = this
|
||||
loadLocationList()
|
||||
|
||||
// 监听选择变化,更新locationId和locationName
|
||||
selectedLocationCode.observeForever { code ->
|
||||
val selectedItem = locationList.value?.find { it.value == code }
|
||||
locationId = selectedItem?.value ?: ""
|
||||
locationName = selectedItem?.key ?: ""
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载库位列表
|
||||
*/
|
||||
private fun loadLocationList() {
|
||||
launchCollect({ NetApply.api.getLocationList(flag = 4) }) {
|
||||
onSuccess = { result ->
|
||||
val list = result.data?.map { it.toKeyValue() } ?: emptyList()
|
||||
locationList.value = list
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg ?: "加载库位列表失败")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存按钮点击
|
||||
*/
|
||||
fun onSaveClick() {
|
||||
if (selectedLocationCode.value.verifyNullOrEmpty("请选择库位")) {
|
||||
return
|
||||
}
|
||||
dismiss()
|
||||
callback(this)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.lukouguoji.gjj.dialog
|
||||
|
||||
import android.content.Context
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.DialogIntImpModifyStorageBinding
|
||||
import com.lukouguoji.module_base.base.BaseDialogModel
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.ktx.launchCollect
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.ktx.verifyNullOrEmpty
|
||||
import dev.utils.app.info.KeyValue
|
||||
|
||||
/**
|
||||
* 国际进港 - 修改库位对话框
|
||||
*/
|
||||
class IntImpModifyStorageDialogModel(
|
||||
private val callback: (IntImpModifyStorageDialogModel) -> Unit
|
||||
) : BaseDialogModel<DialogIntImpModifyStorageBinding>(DIALOG_TYPE_CENTER) {
|
||||
|
||||
// 库位列表
|
||||
val locationList = MutableLiveData<List<KeyValue>>()
|
||||
|
||||
// 选中的库位(存储的是code)
|
||||
val selectedLocationCode = MutableLiveData("")
|
||||
|
||||
// 库位ID (后端需要的code)
|
||||
var locationId: String = ""
|
||||
|
||||
// 库位名称 (后端需要的name)
|
||||
var locationName: String = ""
|
||||
|
||||
override fun layoutId(): Int {
|
||||
return R.layout.dialog_int_imp_modify_storage
|
||||
}
|
||||
|
||||
override fun onDialogCreated(context: Context) {
|
||||
binding.model = this
|
||||
loadLocationList()
|
||||
|
||||
// 监听选择变化,更新locationId和locationName
|
||||
selectedLocationCode.observeForever { code ->
|
||||
val selectedItem = locationList.value?.find { it.value == code }
|
||||
locationId = selectedItem?.value ?: ""
|
||||
locationName = selectedItem?.key ?: ""
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载库位列表
|
||||
*/
|
||||
private fun loadLocationList() {
|
||||
launchCollect({ NetApply.api.getLocationList(flag = 4) }) {
|
||||
onSuccess = { result ->
|
||||
val list = result.data?.map { it.toKeyValue() } ?: emptyList()
|
||||
locationList.value = list
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg ?: "加载库位列表失败")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存按钮点击
|
||||
*/
|
||||
fun onSaveClick() {
|
||||
if (selectedLocationCode.value.verifyNullOrEmpty("请选择库位")) {
|
||||
return
|
||||
}
|
||||
dismiss()
|
||||
callback(this)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.lukouguoji.gjj.dialog
|
||||
|
||||
import android.content.Context
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.DialogIntImpMoveClearBinding
|
||||
import com.lukouguoji.module_base.base.BaseDialogModel
|
||||
import com.lukouguoji.module_base.ktx.verifyNullOrEmpty
|
||||
import dev.utils.app.info.KeyValue
|
||||
|
||||
/**
|
||||
* 国际进港移库 - 清仓操作对话框
|
||||
*/
|
||||
class IntImpMoveClearDialogModel(
|
||||
private val callback: (IntImpMoveClearDialogModel) -> Unit
|
||||
) : BaseDialogModel<DialogIntImpMoveClearBinding>(DIALOG_TYPE_CENTER) {
|
||||
|
||||
// 清仓正常(存储的是 code:"0" 或 "1")
|
||||
val clearNormal = MutableLiveData("")
|
||||
|
||||
// 清仓正常选项列表
|
||||
val clearNormalList = MutableLiveData<List<KeyValue>>().apply {
|
||||
value = listOf(
|
||||
KeyValue("是", "1"),
|
||||
KeyValue("否", "0")
|
||||
)
|
||||
}
|
||||
|
||||
override fun layoutId(): Int {
|
||||
return R.layout.dialog_int_imp_move_clear
|
||||
}
|
||||
|
||||
override fun onDialogCreated(context: Context) {
|
||||
binding.model = this
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存按钮点击
|
||||
*/
|
||||
fun onSaveClick() {
|
||||
if (clearNormal.value.verifyNullOrEmpty("请选择清仓正常")) {
|
||||
return
|
||||
}
|
||||
dismiss()
|
||||
callback(this)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.lukouguoji.gjj.holder
|
||||
|
||||
import android.view.View
|
||||
import com.lukouguoji.gjj.activity.IntImpPickUpRecordDetailsActivity
|
||||
import com.lukouguoji.gjj.databinding.ItemIntImpPickUpRecordBinding
|
||||
import com.lukouguoji.module_base.base.BaseViewHolder
|
||||
import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean
|
||||
|
||||
/**
|
||||
* 国际进港-提取记录 ViewHolder
|
||||
*/
|
||||
class IntImpPickUpRecordViewHolder(view: View) :
|
||||
BaseViewHolder<IntImpPickUpRecordBean, ItemIntImpPickUpRecordBinding>(view) {
|
||||
|
||||
override fun onBind(item: Any?, position: Int) {
|
||||
val bean = getItemBean(item) ?: return
|
||||
binding.bean = bean
|
||||
binding.position = position
|
||||
binding.executePendingBindings()
|
||||
|
||||
// 图标点击切换选择状态
|
||||
binding.ivIcon.setOnClickListener {
|
||||
bean.checked.set(!bean.checked.get())
|
||||
binding.executePendingBindings()
|
||||
}
|
||||
|
||||
// 列表项点击进入提取详情
|
||||
itemView.setOnClickListener {
|
||||
IntImpPickUpRecordDetailsActivity.start(itemView.context, bean.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.lukouguoji.gjj.holder
|
||||
|
||||
import android.view.View
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lukouguoji.gjj.databinding.ItemIntImpStorageUseSubBinding
|
||||
import com.lukouguoji.module_base.base.BaseViewHolder
|
||||
import com.lukouguoji.module_base.bean.GjcMaWb
|
||||
import com.lukouguoji.module_base.bean.GjcStorageUse
|
||||
|
||||
/**
|
||||
* 国际进港-仓库 库位明细行 ViewHolder
|
||||
*/
|
||||
class IntImpStorageUseSubViewHolder(view: View) :
|
||||
BaseViewHolder<GjcStorageUse, ItemIntImpStorageUseSubBinding>(view) {
|
||||
|
||||
override fun onBind(item: Any?, position: Int) {
|
||||
val bean = getItemBean(item) ?: return
|
||||
binding.bean = bean
|
||||
binding.position = position
|
||||
binding.executePendingBindings()
|
||||
|
||||
// 单选框点击切换选择状态(反向联动主列表)
|
||||
binding.ivCheckbox.setOnClickListener {
|
||||
// 切换子列表项的选择状态
|
||||
val newCheckedState = !bean.checked.get()
|
||||
bean.checked.set(newCheckedState)
|
||||
binding.executePendingBindings()
|
||||
|
||||
// 反向联动主列表项(仅在勾选时联动)
|
||||
updateParentCheckState(newCheckedState)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新父列表项的选择状态
|
||||
*/
|
||||
private fun updateParentCheckState(newCheckedState: Boolean) {
|
||||
val recyclerView = itemView.parent as? RecyclerView ?: return
|
||||
val parentBean = recyclerView.tag as? GjcMaWb ?: return
|
||||
|
||||
if (newCheckedState) {
|
||||
parentBean.checked.set(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.lukouguoji.gjj.holder
|
||||
|
||||
import android.view.View
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.databinding.ItemIntImpStorageUseBinding
|
||||
import com.lukouguoji.module_base.adapter.setCommonAdapter
|
||||
import com.lukouguoji.module_base.base.BaseViewHolder
|
||||
import com.lukouguoji.module_base.bean.GjcMaWb
|
||||
import com.lukouguoji.module_base.ktx.refresh
|
||||
|
||||
/**
|
||||
* 国际进港-仓库 ViewHolder
|
||||
*/
|
||||
class IntImpStorageUseViewHolder(view: View) :
|
||||
BaseViewHolder<GjcMaWb, ItemIntImpStorageUseBinding>(view) {
|
||||
|
||||
override fun onBind(item: Any?, position: Int) {
|
||||
val bean = getItemBean(item) ?: return
|
||||
binding.bean = bean
|
||||
binding.position = position
|
||||
binding.executePendingBindings()
|
||||
|
||||
// 图标点击切换选择状态(联动子列表)
|
||||
binding.ivIcon.setOnClickListener {
|
||||
val newCheckedState = !bean.checked.get()
|
||||
bean.checked.set(newCheckedState)
|
||||
|
||||
// 联动勾选/取消所有子列表项
|
||||
bean.storageUseList?.forEach { storageUse ->
|
||||
storageUse.checked.set(newCheckedState)
|
||||
}
|
||||
|
||||
binding.executePendingBindings()
|
||||
binding.rvSub.adapter?.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
// 展开按钮点击事件
|
||||
binding.ivShow.setOnClickListener {
|
||||
bean.showMore.set(!bean.showMore.get())
|
||||
}
|
||||
|
||||
// 初始化库位明细子列表 RecyclerView
|
||||
setCommonAdapter(
|
||||
binding.rvSub,
|
||||
IntImpStorageUseSubViewHolder::class.java,
|
||||
R.layout.item_int_imp_storage_use_sub
|
||||
)
|
||||
|
||||
// 刷新库位明细数据(传递父Bean引用)
|
||||
val storageUseList = bean.storageUseList ?: emptyList()
|
||||
binding.rvSub.tag = bean
|
||||
binding.rvSub.refresh(storageUseList)
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,15 @@ import dev.utils.common.DateUtils
|
||||
import com.lukouguoji.module_base.ktx.formatDate
|
||||
import com.lukouguoji.gjj.holder.IntImpMsgParseViewHolder
|
||||
import com.lukouguoji.module_base.base.BasePageViewModel
|
||||
import com.lukouguoji.module_base.bean.FlightBean
|
||||
import com.lukouguoji.module_base.bean.MsgReceivePool
|
||||
import com.lukouguoji.module_base.common.ConstantEvent
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.impl.FlowBus
|
||||
import com.lukouguoji.module_base.ktx.commonAdapter
|
||||
import com.lukouguoji.module_base.ktx.launchCollect
|
||||
import com.lukouguoji.module_base.ktx.launchLoadingCollect
|
||||
import com.lukouguoji.module_base.ktx.noNull
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.ktx.toRequestBody
|
||||
import dev.utils.app.info.KeyValue
|
||||
@@ -28,10 +31,14 @@ class IntImpMsgParseViewModel : BasePageViewModel() {
|
||||
val flightNo = MutableLiveData("") // 航班号
|
||||
val sendAddress = MutableLiveData("") // 发站(择始发站)
|
||||
val sendAddressList = MutableLiveData<List<KeyValue>>(emptyList())
|
||||
val receiveAddress = MutableLiveData("HFE") // 收报地址(目的站)
|
||||
val receiveAddress = MutableLiveData("") // 收报地址(目的站,由航班查询返回)
|
||||
val msgType = MutableLiveData("") // 报文类型
|
||||
val msgTypeList = MutableLiveData<List<KeyValue>>(emptyList())
|
||||
|
||||
// ========== 航班查询 ==========
|
||||
private var fid: String = "" // 航班ID
|
||||
private var lastQueriedFlight = "" // 避免重复查询
|
||||
|
||||
// ========== 统计信息 ==========
|
||||
val totalCount = MutableLiveData("0") // 合计条数
|
||||
|
||||
@@ -39,6 +46,12 @@ class IntImpMsgParseViewModel : BasePageViewModel() {
|
||||
val isAllChecked = MutableLiveData(false)
|
||||
|
||||
init {
|
||||
// 初始化报文类型静态数据
|
||||
msgTypeList.value = listOf(
|
||||
KeyValue("FFM", "FFM"),
|
||||
KeyValue("FWB/FHL", "FWB/FHL")
|
||||
)
|
||||
|
||||
// 监听全选状态,自动更新所有列表项
|
||||
isAllChecked.observeForever { checked ->
|
||||
val list = pageModel.rv?.commonAdapter()?.items as? List<MsgReceivePool> ?: return@observeForever
|
||||
@@ -47,6 +60,68 @@ class IntImpMsgParseViewModel : BasePageViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 航班级联查询 ==========
|
||||
|
||||
fun onFlightDateInputComplete() {
|
||||
lastQueriedFlight = ""
|
||||
queryFlightIfReady()
|
||||
}
|
||||
|
||||
fun onFlightNoInputComplete() {
|
||||
queryFlightIfReady()
|
||||
}
|
||||
|
||||
private fun queryFlightIfReady() {
|
||||
val fdate = flightDate.value
|
||||
val fno = flightNo.value
|
||||
if (fdate.isNullOrEmpty() || fno.isNullOrEmpty()) return
|
||||
|
||||
val key = "$fdate-$fno"
|
||||
if (key == lastQueriedFlight) return
|
||||
lastQueriedFlight = key
|
||||
|
||||
launchCollect({
|
||||
NetApply.api.getGjFlightBean(
|
||||
mapOf(
|
||||
"fdate" to fdate,
|
||||
"fno" to fno,
|
||||
"ieFlag" to "I",
|
||||
).toRequestBody()
|
||||
)
|
||||
}) {
|
||||
onSuccess = {
|
||||
if (it.verifySuccess() && it.data != null) {
|
||||
val flight = it.data!!
|
||||
fid = flight.fid.noNull()
|
||||
receiveAddress.value = flight.fdest.noNull()
|
||||
|
||||
// 构建始发站下拉列表:fdep + jtz(经停港)
|
||||
val list = mutableListOf(
|
||||
KeyValue(flight.fdep.noNull(), flight.fdep.noNull()),
|
||||
)
|
||||
if (!flight.jtz.isNullOrEmpty()) {
|
||||
list.add(KeyValue(flight.jtz.noNull(), flight.jtz.noNull()))
|
||||
}
|
||||
sendAddressList.value = list
|
||||
sendAddress.value = flight.fdep.noNull()
|
||||
} else {
|
||||
fid = ""
|
||||
receiveAddress.value = ""
|
||||
sendAddressList.value = emptyList()
|
||||
sendAddress.value = ""
|
||||
showToast(it.msg.noNull("获取航班信息失败"))
|
||||
}
|
||||
}
|
||||
|
||||
onFailed = { _, _ ->
|
||||
fid = ""
|
||||
receiveAddress.value = ""
|
||||
sendAddressList.value = listOf(KeyValue("全部", ""))
|
||||
sendAddress.value = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 适配器配置 ==========
|
||||
val itemViewHolder = IntImpMsgParseViewHolder::class.java
|
||||
val itemLayoutId = R.layout.item_int_imp_msg_parse
|
||||
@@ -55,6 +130,10 @@ class IntImpMsgParseViewModel : BasePageViewModel() {
|
||||
* 搜索按钮点击
|
||||
*/
|
||||
fun searchClick() {
|
||||
if (msgType.value.isNullOrEmpty()) {
|
||||
showToast("请选择报文类型")
|
||||
return
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
|
||||
@@ -103,13 +182,18 @@ class IntImpMsgParseViewModel : BasePageViewModel() {
|
||||
* 获取数据(重写BasePageViewModel)
|
||||
*/
|
||||
override fun getData() {
|
||||
// 构建搜索条件
|
||||
val filterParams = mutableMapOf(
|
||||
"fdate" to flightDate.value?.ifEmpty { null },
|
||||
"fno" to flightNo.value?.ifEmpty { null },
|
||||
// 构建搜索条件:优先用 fid,否则用 fdate + fno
|
||||
val filterParams = mutableMapOf<String, Any?>(
|
||||
"sendAddress" to sendAddress.value?.ifEmpty { null },
|
||||
"receiveAddress" to receiveAddress.value?.ifEmpty { null },
|
||||
"msgType" to msgType.value?.ifEmpty { null }
|
||||
)
|
||||
if (fid.isNotEmpty()) {
|
||||
filterParams["fid"] = fid
|
||||
} else {
|
||||
filterParams["fdate"] = flightDate.value?.ifEmpty { null }
|
||||
filterParams["fno"] = flightNo.value?.ifEmpty { null }
|
||||
}
|
||||
|
||||
// 列表参数(含分页)
|
||||
val listParams = (filterParams + mapOf(
|
||||
@@ -119,10 +203,9 @@ class IntImpMsgParseViewModel : BasePageViewModel() {
|
||||
|
||||
// 获取列表(带Loading)
|
||||
launchLoadingCollect({ NetApply.api.getIntImpMsgList(listParams) }) {
|
||||
onSuccess = { result ->
|
||||
val pageInfo = result.data
|
||||
pageModel.handleListBean(pageInfo?.toBaseListBean())
|
||||
totalCount.value = (pageInfo?.total ?: 0).toString()
|
||||
onSuccess = { pageInfo ->
|
||||
pageModel.handleListBean(pageInfo.toBaseListBean())
|
||||
totalCount.value = (pageInfo.total ?: 0).toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.lukouguoji.gjj.viewModel
|
||||
|
||||
import android.content.Intent
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.lukouguoji.module_base.base.BaseViewModel
|
||||
import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean
|
||||
import com.lukouguoji.module_base.common.Constant
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.ktx.launchLoadingCollect
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.ktx.toRequestBody
|
||||
|
||||
/**
|
||||
* 国际进港提取详情 ViewModel
|
||||
*/
|
||||
class IntImpPickUpRecordDetailsViewModel : BaseViewModel() {
|
||||
|
||||
var recordId: Long = 0
|
||||
|
||||
val dataBean = MutableLiveData(IntImpPickUpRecordBean())
|
||||
|
||||
fun initOnCreated(intent: Intent) {
|
||||
recordId = intent.getLongExtra(Constant.Key.ID, 0)
|
||||
if (recordId > 0) {
|
||||
getData()
|
||||
} else {
|
||||
showToast("参数错误")
|
||||
getTopActivity().finish()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getData() {
|
||||
val params = mapOf("id" to recordId).toRequestBody()
|
||||
launchLoadingCollect({
|
||||
NetApply.api.getIntImpPickUpRecordDetails(params)
|
||||
}) {
|
||||
onSuccess = {
|
||||
dataBean.value = it.data ?: IntImpPickUpRecordBean()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
package com.lukouguoji.gjj.viewModel
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.holder.IntImpPickUpRecordViewHolder
|
||||
import com.lukouguoji.module_base.base.BasePageViewModel
|
||||
import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean
|
||||
import com.lukouguoji.module_base.common.Constant
|
||||
import com.lukouguoji.module_base.common.ConstantEvent
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.impl.FlowBus
|
||||
import com.lukouguoji.module_base.ktx.commonAdapter
|
||||
import com.lukouguoji.module_base.ktx.launchCollect
|
||||
import com.lukouguoji.module_base.ktx.launchLoadingCollect
|
||||
import com.lukouguoji.module_base.ktx.noNull
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.ktx.toRequestBody
|
||||
import com.lukouguoji.module_base.model.ScanModel
|
||||
import com.lukouguoji.module_base.util.DictUtils
|
||||
import dev.utils.app.info.KeyValue
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
/**
|
||||
* 国际进港-提取记录 ViewModel
|
||||
*/
|
||||
class IntImpPickUpRecordViewModel : BasePageViewModel() {
|
||||
|
||||
// ========== 筛选条件 ==========
|
||||
val paymentDateStart = MutableLiveData("") // 缴费日期起
|
||||
val paymentDateEnd = MutableLiveData("") // 缴费日期止
|
||||
val agentCode = MutableLiveData("") // 代理人
|
||||
val spCode = MutableLiveData("") // 特码
|
||||
val wbNo = MutableLiveData("") // 运单号
|
||||
|
||||
// ========== 下拉列表数据源 ==========
|
||||
val agentList = MutableLiveData(listOf(KeyValue("全部", "")))
|
||||
val spCodeList = MutableLiveData<List<KeyValue>>(emptyList())
|
||||
|
||||
// ========== 统计信息 ==========
|
||||
val totalCount = MutableLiveData("0") // 合计票数
|
||||
val totalPc = MutableLiveData("0") // 总件数
|
||||
val totalWeight = MutableLiveData("0") // 总重量
|
||||
|
||||
// ========== 全选状态 ==========
|
||||
val isAllChecked = MutableLiveData(false)
|
||||
|
||||
init {
|
||||
isAllChecked.observeForever { checked ->
|
||||
val list = pageModel.rv?.commonAdapter()?.items as? List<IntImpPickUpRecordBean>
|
||||
?: return@observeForever
|
||||
list.forEach { it.checked.set(checked) }
|
||||
pageModel.rv?.commonAdapter()?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 适配器配置 ==========
|
||||
val itemViewHolder = IntImpPickUpRecordViewHolder::class.java
|
||||
val itemLayoutId = R.layout.item_int_imp_pick_up_record
|
||||
|
||||
/**
|
||||
* 初始化代理人列表
|
||||
*/
|
||||
fun initAgentList() {
|
||||
launchCollect({ NetApply.api.getIntImpAgentList() }) {
|
||||
onSuccess = { result ->
|
||||
val list = mutableListOf(KeyValue("全部", ""))
|
||||
result.data?.forEach {
|
||||
list.add(KeyValue(it.name ?: "", it.code ?: ""))
|
||||
}
|
||||
agentList.value = list
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化特码列表
|
||||
*/
|
||||
fun initSpecialCodeList() {
|
||||
DictUtils.getSpecialCodeList(
|
||||
flag = 1, // 国际
|
||||
ieFlag = "I", // 进港
|
||||
parentcode = ""
|
||||
) {
|
||||
spCodeList.value = it
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索按钮点击
|
||||
*/
|
||||
fun searchClick() {
|
||||
refresh()
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫码运单号
|
||||
*/
|
||||
fun scanWbNo() {
|
||||
ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL)
|
||||
}
|
||||
|
||||
/**
|
||||
* 全选按钮点击
|
||||
*/
|
||||
fun checkAllClick() {
|
||||
val list = pageModel.rv?.commonAdapter()?.items as? List<IntImpPickUpRecordBean> ?: return
|
||||
|
||||
val shouldCheckAll = !isAllChecked.value!!
|
||||
list.forEach { it.checked.set(shouldCheckAll) }
|
||||
isAllChecked.value = shouldCheckAll
|
||||
pageModel.rv?.commonAdapter()?.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除提货操作
|
||||
*/
|
||||
fun clearPickUp(selectedItems: List<IntImpPickUpRecordBean>) {
|
||||
if (selectedItems.isEmpty()) {
|
||||
showToast("请选择要清除提货的记录")
|
||||
return
|
||||
}
|
||||
|
||||
val params = selectedItems.toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.clearIntImpPickUp(params) }) {
|
||||
onSuccess = {
|
||||
showToast("清除提货成功")
|
||||
viewModelScope.launch {
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg.noNull("清除提货失败"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取列表数据
|
||||
*/
|
||||
override fun getData() {
|
||||
val filterParams = mapOf(
|
||||
"paymentDateStart" to paymentDateStart.value?.ifEmpty { null },
|
||||
"paymentDateEnd" to paymentDateEnd.value?.ifEmpty { null },
|
||||
"agentCode" to agentCode.value?.ifEmpty { null },
|
||||
"spCode" to spCode.value?.ifEmpty { null },
|
||||
"wbNo" to wbNo.value?.ifEmpty { null }
|
||||
)
|
||||
|
||||
val listParams = (filterParams + mapOf(
|
||||
"pageNum" to pageModel.page,
|
||||
"pageSize" to pageModel.limit
|
||||
)).toRequestBody()
|
||||
|
||||
val totalParams = filterParams.toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.getIntImpPickUpRecordList(listParams) }) {
|
||||
onSuccess = { result ->
|
||||
pageModel.handleDataList(result.list)
|
||||
pageModel.haveMore.postValue((result.pages) > pageModel.page)
|
||||
}
|
||||
}
|
||||
|
||||
launchCollect({ NetApply.api.getIntImpPickUpRecordTotal(totalParams) }) {
|
||||
onSuccess = { result ->
|
||||
val data = result.data
|
||||
totalCount.value = (data?.wbNumber ?: 0).toString()
|
||||
totalPc.value = (data?.totalPc ?: 0).toString()
|
||||
totalWeight.value = (data?.totalWeight ?: 0.0).toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理扫码结果
|
||||
*/
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
if (resultCode == Activity.RESULT_OK && data != null) {
|
||||
when (requestCode) {
|
||||
Constant.RequestCode.WAYBILL -> {
|
||||
wbNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT)
|
||||
refresh()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,287 @@
|
||||
package com.lukouguoji.gjj.viewModel
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.lukouguoji.gjj.R
|
||||
import com.lukouguoji.gjj.holder.IntImpStorageUseViewHolder
|
||||
import com.lukouguoji.module_base.base.BasePageViewModel
|
||||
import com.lukouguoji.module_base.bean.GjcMaWb
|
||||
import com.lukouguoji.module_base.common.Constant
|
||||
import com.lukouguoji.module_base.common.ConstantEvent
|
||||
import com.lukouguoji.module_base.http.net.NetApply
|
||||
import com.lukouguoji.module_base.impl.FlowBus
|
||||
import com.lukouguoji.module_base.ktx.commonAdapter
|
||||
import com.lukouguoji.module_base.ktx.formatDate
|
||||
import com.lukouguoji.module_base.ktx.launchCollect
|
||||
import com.lukouguoji.module_base.ktx.launchLoadingCollect
|
||||
import com.lukouguoji.module_base.ktx.noNull
|
||||
import com.lukouguoji.module_base.ktx.showToast
|
||||
import com.lukouguoji.module_base.ktx.toRequestBody
|
||||
import com.lukouguoji.module_base.model.ScanModel
|
||||
import dev.utils.app.info.KeyValue
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.Date
|
||||
|
||||
/**
|
||||
* 国际进港-仓库 ViewModel
|
||||
*/
|
||||
class IntImpStorageUseViewModel : BasePageViewModel() {
|
||||
|
||||
// ========== 筛选条件 ==========
|
||||
val flightDate = MutableLiveData(Date().formatDate()) // 航班日期,默认今天
|
||||
val flightNo = MutableLiveData("") // 航班号
|
||||
val clearResult = MutableLiveData("") // 清仓综合结果
|
||||
val clearResultList = MutableLiveData<List<KeyValue>>() // 清仓综合结果列表
|
||||
val wbNo = MutableLiveData("") // 运单号
|
||||
val location = MutableLiveData("") // 库位号
|
||||
|
||||
// ========== 统计信息 ==========
|
||||
val totalWbNumber = MutableLiveData("0") // 总票数
|
||||
val totalPc = MutableLiveData("0") // 总件数
|
||||
val totalWeight = MutableLiveData("0") // 总重量
|
||||
|
||||
// ========== 全选状态 ==========
|
||||
val isAllChecked = MutableLiveData(false)
|
||||
|
||||
// ========== 全局展开状态 ==========
|
||||
val isAllExpanded = MutableLiveData(false)
|
||||
|
||||
init {
|
||||
clearResultList.value = listOf(
|
||||
KeyValue("全部", ""),
|
||||
KeyValue("正常", "0"),
|
||||
KeyValue("异常", "1")
|
||||
)
|
||||
|
||||
isAllChecked.observeForever { checked ->
|
||||
val list =
|
||||
pageModel.rv?.commonAdapter()?.items as? List<GjcMaWb> ?: return@observeForever
|
||||
list.forEach { it.checked.set(checked) }
|
||||
pageModel.rv?.commonAdapter()?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 适配器配置 ==========
|
||||
val itemViewHolder = IntImpStorageUseViewHolder::class.java
|
||||
val itemLayoutId = R.layout.item_int_imp_storage_use
|
||||
|
||||
fun searchClick() {
|
||||
refresh()
|
||||
}
|
||||
|
||||
/**
|
||||
* 全选按钮点击(联动勾选所有子列表项)
|
||||
*/
|
||||
fun checkAllClick() {
|
||||
val list = pageModel.rv?.commonAdapter()?.items as? List<GjcMaWb> ?: return
|
||||
|
||||
val shouldCheckAll = !isAllChecked.value!!
|
||||
|
||||
list.forEach { maWb ->
|
||||
maWb.checked.set(shouldCheckAll)
|
||||
maWb.storageUseList?.forEach { storageUse ->
|
||||
storageUse.checked.set(shouldCheckAll)
|
||||
}
|
||||
}
|
||||
|
||||
isAllChecked.value = shouldCheckAll
|
||||
|
||||
pageModel.rv?.commonAdapter()?.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换全局展开/收起状态
|
||||
*/
|
||||
fun toggleAllExpand() {
|
||||
val list = pageModel.rv?.commonAdapter()?.items as? List<GjcMaWb> ?: return
|
||||
|
||||
val shouldExpand = !isAllExpanded.value!!
|
||||
isAllExpanded.value = shouldExpand
|
||||
|
||||
list.forEach { bean ->
|
||||
if (!bean.storageUseList.isNullOrEmpty()) {
|
||||
bean.showMore.set(shouldExpand)
|
||||
}
|
||||
}
|
||||
|
||||
pageModel.rv?.commonAdapter()?.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun scanWbNo() {
|
||||
ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL)
|
||||
}
|
||||
|
||||
fun clearStorage() {
|
||||
// 由Activity显示对话框
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行清仓操作
|
||||
*/
|
||||
fun performClear(clearNormal: String, maWbListForClear: List<GjcMaWb>) {
|
||||
if (maWbListForClear.isEmpty()) {
|
||||
showToast("请至少选择一个库位")
|
||||
return
|
||||
}
|
||||
|
||||
val params = mapOf(
|
||||
"clearNormal" to clearNormal,
|
||||
"maWbList" to maWbListForClear
|
||||
).toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.clearIntImpStorage(params) }) {
|
||||
onSuccess = {
|
||||
showToast("清仓成功")
|
||||
viewModelScope.launch {
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg.noNull("清仓失败"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun modifyStorage() {
|
||||
// 由Activity显示对话框
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行修改库位操作
|
||||
*/
|
||||
fun performModifyStorage(
|
||||
locationName: String,
|
||||
locationId: String,
|
||||
storageUse: com.lukouguoji.module_base.bean.GjcStorageUse
|
||||
) {
|
||||
if (locationName.isEmpty() || locationId.isEmpty()) {
|
||||
showToast("请选择库位")
|
||||
return
|
||||
}
|
||||
|
||||
val updatedStorage = storageUse.copy(
|
||||
location = locationName,
|
||||
locationId = locationId.toLongOrNull() ?: 0
|
||||
)
|
||||
|
||||
val params = updatedStorage.toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.modifyIntImpStorage(params) }) {
|
||||
onSuccess = {
|
||||
showToast("修改库位成功")
|
||||
viewModelScope.launch {
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg.noNull("修改库位失败"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun outStorage() {
|
||||
// 由Activity显示二次确认对话框
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行出库操作
|
||||
*/
|
||||
fun performOutStorage(selectedStorageList: List<com.lukouguoji.module_base.bean.GjcStorageUse>) {
|
||||
if (selectedStorageList.isEmpty()) {
|
||||
showToast("请选择要出库的库位")
|
||||
return
|
||||
}
|
||||
|
||||
val params = selectedStorageList.toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.outIntImpStorage(params) }) {
|
||||
onSuccess = {
|
||||
showToast("出库成功")
|
||||
viewModelScope.launch {
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg.noNull("出库失败"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun inStorage() {
|
||||
// 由Activity显示对话框
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行入库操作
|
||||
*/
|
||||
fun performInStorage(
|
||||
locationName: String,
|
||||
locationId: String,
|
||||
maWbListForInStorage: List<GjcMaWb>
|
||||
) {
|
||||
if (maWbListForInStorage.isEmpty()) {
|
||||
showToast("请至少选择一个单据")
|
||||
return
|
||||
}
|
||||
|
||||
if (locationName.isEmpty() || locationId.isEmpty()) {
|
||||
showToast("请选择库位")
|
||||
return
|
||||
}
|
||||
|
||||
val params = mapOf(
|
||||
"location" to locationName,
|
||||
"locationId" to locationId.toLongOrNull(),
|
||||
"maWbList" to maWbListForInStorage
|
||||
).toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.inIntImpStorage(params) }) {
|
||||
onSuccess = {
|
||||
showToast("入库成功")
|
||||
viewModelScope.launch {
|
||||
FlowBus.with<String>(ConstantEvent.EVENT_REFRESH).emit("refresh")
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
onFailed = { _, msg ->
|
||||
showToast(msg.noNull("入库失败"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getData() {
|
||||
val filterParams = mapOf(
|
||||
"fdate" to flightDate.value?.ifEmpty { null },
|
||||
"fno" to flightNo.value?.ifEmpty { null },
|
||||
"wbNo" to wbNo.value?.ifEmpty { null },
|
||||
"location" to location.value?.ifEmpty { null }
|
||||
)
|
||||
|
||||
val listParams = (filterParams + mapOf(
|
||||
"pageNum" to pageModel.page,
|
||||
"pageSize" to pageModel.limit
|
||||
)).toRequestBody()
|
||||
|
||||
val totalParams = filterParams.toRequestBody()
|
||||
|
||||
launchLoadingCollect({ NetApply.api.getIntImpStorageUseList(listParams) }) {
|
||||
onSuccess = { result ->
|
||||
pageModel.handleDataList(result.list)
|
||||
pageModel.haveMore.postValue((result.pages) > pageModel.page)
|
||||
isAllExpanded.value = false
|
||||
}
|
||||
}
|
||||
|
||||
launchCollect({ NetApply.api.getIntImpStorageUseTotal(totalParams) }) {
|
||||
onSuccess = { result ->
|
||||
val data = result.data
|
||||
totalWbNumber.value = (data?.wbNumber ?: 0).toString()
|
||||
totalPc.value = (data?.totalPc ?: 0).toString()
|
||||
totalWeight.value = (data?.totalWeight ?: 0.0).toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user