diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f4cfb47..a4e1f81 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -393,6 +393,13 @@ android:exported="false" android:screenOrientation="userLandscape" /> + + + diff --git a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt index a5289f7..b2e1adc 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt @@ -1586,4 +1586,16 @@ interface Api { */ @POST("IntImpManifest/pageQueryTotal") suspend fun getIntImpManifestTotal(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港舱单-分拣理货(装机单)-分页查询 + */ + @POST("IntImpManifest/pageQueryAir") + suspend fun getIntImpLoadingList(@Body data: RequestBody): BaseResultBean> + + /** + * 国际进港舱单-分拣理货(装机单)-分页合计 + */ + @POST("IntImpManifest/pageQueryAirTotal") + suspend fun getIntImpLoadingTotal(@Body data: RequestBody): BaseResultBean } \ No newline at end of file diff --git a/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt b/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt index 2e6ff6b..4a14498 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt @@ -172,6 +172,7 @@ object ARouterConstants { const val ACTIVITY_URL_INT_ARR_AIR_MANIFEST_DETAILS = "/gjj/IntArrAirManifestDetailsActivity" //国际进港 原始舱单详情 const val ACTIVITY_URL_INT_ARR_SUPPLEMENT_INFO = "/gjj/IntArrSupplementInfoActivity" //国际进港 补充信息 const val ACTIVITY_URL_INT_IMP_MANIFEST = "/gjj/IntImpManifestActivity" //国际进港 进港舱单 + const val ACTIVITY_URL_INT_IMP_LOADING_LIST = "/gjj/IntImpLoadingListActivity" //国际进港 装机单(分拣理货) ///////////////// 航班查询模块 /** diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt new file mode 100644 index 0000000..9c76150 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpLoadingListActivity.kt @@ -0,0 +1,59 @@ +package com.lukouguoji.gjj.activity + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.databinding.ActivityIntImpLoadingListBinding +import com.lukouguoji.gjj.viewModel.IntImpLoadingListViewModel +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.addOnItemClickListener +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国际进港-装机单页面(分拣理货) + */ +@Route(path = ARouterConstants.ACTIVITY_URL_INT_IMP_LOADING_LIST) +class IntImpLoadingListActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_int_imp_loading_list + override fun viewModelClass() = IntImpLoadingListViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("国际进港装机单") + binding.viewModel = viewModel + + // 观察全选状态,更新图标透明度 + viewModel.isAllChecked.observe(this) { isAllChecked -> + binding.checkIcon.alpha = if (isAllChecked) 1.0f else 0.5f + } + + // 绑定分页 + viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this) + + // 设置item点击监听 + binding.rv.addOnItemClickListener(viewModel) + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { + viewModel.refresh() + } + + // 初始加载数据 + viewModel.refresh() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) { + viewModel.waybillNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) + viewModel.searchClick() + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt new file mode 100644 index 0000000..42fb679 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpLoadingListViewHolder.kt @@ -0,0 +1,26 @@ +package com.lukouguoji.gjj.holder + +import android.view.View +import com.lukouguoji.gjj.databinding.ItemIntImpLoadingListBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GjjManifest + +/** + * 国际进港装机单 ViewHolder + */ +class IntImpLoadingListViewHolder(view: View) : + BaseViewHolder(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() + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt new file mode 100644 index 0000000..ad59110 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpLoadingListViewModel.kt @@ -0,0 +1,159 @@ +package com.lukouguoji.gjj.viewModel + +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.holder.IntImpLoadingListViewHolder +import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.GjjManifest +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.http.net.NetApply +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.showToast +import com.lukouguoji.module_base.ktx.toRequestBody +import com.lukouguoji.module_base.model.ScanModel + +/** + * 国际进港装机单 ViewModel + */ +class IntImpLoadingListViewModel : BasePageViewModel() { + + // ========== 搜索条件 ========== + val flightDate = MutableLiveData("") // 航班日期 + val flightNo = MutableLiveData("") // 航班号 + val fdep = MutableLiveData("") // 始发站 + val fdest = MutableLiveData("") // 目的站 + val waybillNo = MutableLiveData("") // 运单号 + + // ========== 统计信息 ========== + 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 ?: return@observeForever + list.forEach { it.checked.set(checked) } + pageModel.rv?.commonAdapter()?.notifyDataSetChanged() + } + } + + // ========== 适配器配置 ========== + val itemViewHolder = IntImpLoadingListViewHolder::class.java + val itemLayoutId = R.layout.item_int_imp_loading_list + + /** + * 搜索按钮点击 + */ + fun searchClick() { + refresh() + } + + /** + * 全选按钮点击(切换全选状态) + */ + fun checkAllClick() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + + // 切换全选状态 + val shouldCheckAll = !isAllChecked.value!! + list.forEach { it.checked.set(shouldCheckAll) } + isAllChecked.value = shouldCheckAll + + pageModel.rv?.commonAdapter()?.notifyDataSetChanged() + } + + /** + * 扫码运单号 + */ + fun scanWaybill() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + /** + * 修改库位按钮点击 + */ + fun modifyLocationClick() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择要修改库位的记录") + return + } + + showToast("修改库位功能开发中") + } + + /** + * 入库按钮点击 + */ + fun inboundClick() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择要入库的记录") + return + } + + showToast("入库功能开发中") + } + + /** + * 获取数据(重写BasePageViewModel) + */ + override fun getData() { + // 构建搜索条件 + val filterParams = mapOf( + "fdate" to flightDate.value?.ifEmpty { null }, + "fno" to flightNo.value?.ifEmpty { null }, + "fdep" to fdep.value?.ifEmpty { null }, + "fdest" to fdest.value?.ifEmpty { null }, + "wbNo" to waybillNo.value?.ifEmpty { null } + ) + + // 列表参数(含分页) + val listParams = (filterParams + mapOf( + "pageNum" to pageModel.page, + "pageSize" to pageModel.limit + )).toRequestBody() + + // 统计参数(无分页) + val totalParams = filterParams.toRequestBody() + + // 获取列表(带Loading) + launchLoadingCollect({ NetApply.api.getIntImpLoadingList(listParams) }) { + onSuccess = { result -> + // 处理PageInfo结构 + val pageInfo = result.data + if (pageInfo != null) { + val list = pageInfo.list ?: emptyList() + val pages = pageInfo.pages ?: 1 + + // 处理分页数据 + pageModel.handleDataList(list) + pageModel.haveMore.postValue(pages > pageModel.page) + } else { + pageModel.handleDataList(emptyList()) + pageModel.haveMore.postValue(false) + } + } + } + + // 获取统计信息(后台请求,不阻塞列表) + launchCollect({ NetApply.api.getIntImpLoadingTotal(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() + } + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt index 85180e0..51776b2 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpManifestViewModel.kt @@ -109,10 +109,12 @@ class IntImpManifestViewModel : BasePageViewModel() { } /** - * 分拣理货(暂不实现) + * 分拣理货(跳转装机单页面) */ fun sortingTallyClick() { - showToast("分拣理货功能开发中") + com.alibaba.android.arouter.launcher.ARouter.getInstance() + .build(com.lukouguoji.module_base.router.ARouterConstants.ACTIVITY_URL_INT_IMP_LOADING_LIST) + .navigation() } /** diff --git a/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml b/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml new file mode 100644 index 0000000..0aff104 --- /dev/null +++ b/module_gjj/src/main/res/layout/activity_int_imp_loading_list.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml b/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml new file mode 100644 index 0000000..e616f75 --- /dev/null +++ b/module_gjj/src/main/res/layout/item_int_imp_loading_list.xml @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +