From 06713190e04484eaae321f801e406cdc19ed588f Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Sun, 8 Mar 2026 18:31:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BB=BC=E5=90=88?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=86=B7=E5=BA=93=E7=99=BB=E8=AE=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- app/src/main/AndroidManifest.xml | 4 + .../coldStorage/list/ColdStorageActivity.kt | 62 ++++ .../coldStorage/list/ColdStorageViewHolder.kt | 26 ++ .../coldStorage/list/ColdStorageViewModel.kt | 175 +++++++++++ .../aerologic/ui/fragment/HomeFragment.kt | 12 + .../main/res/layout/activity_cold_storage.xml | 208 +++++++++++++ app/src/main/res/layout/item_cold_storage.xml | 283 ++++++++++++++++++ .../module_base/bean/ColdStorageBean.kt | 26 ++ .../lukouguoji/module_base/common/Constant.kt | 3 + .../lukouguoji/module_base/http/net/Api.kt | 29 ++ .../module_base/router/ARouterConstants.kt | 3 + 11 files changed, 831 insertions(+) create mode 100644 app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageActivity.kt create mode 100644 app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewHolder.kt create mode 100644 app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewModel.kt create mode 100644 app/src/main/res/layout/activity_cold_storage.xml create mode 100644 app/src/main/res/layout/item_cold_storage.xml create mode 100644 module_base/src/main/java/com/lukouguoji/module_base/bean/ColdStorageBean.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e94a4fd..e53e927 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -310,6 +310,10 @@ android:name=".page.transportLog.list.TransportLogActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="userLandscape" /> + () { + + override fun layoutId() = R.layout.activity_cold_storage + override fun viewModelClass() = ColdStorageViewModel::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) + + // 监听刷新事件 + 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.wbNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) + viewModel.searchClick() + } + } + + companion object { + @JvmStatic + fun start(context: Context) { + context.startActivity(Intent(context, ColdStorageActivity::class.java)) + } + } +} diff --git a/app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewHolder.kt b/app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewHolder.kt new file mode 100644 index 0000000..3db7a5e --- /dev/null +++ b/app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewHolder.kt @@ -0,0 +1,26 @@ +package com.lukouguoji.aerologic.page.coldStorage.list + +import android.view.View +import com.lukouguoji.aerologic.databinding.ItemColdStorageBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.ColdStorageBean + +/** + * 冷库登记 列表项ViewHolder + */ +class ColdStorageViewHolder(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/app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewModel.kt b/app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewModel.kt new file mode 100644 index 0000000..97a99ed --- /dev/null +++ b/app/src/main/java/com/lukouguoji/aerologic/page/coldStorage/list/ColdStorageViewModel.kt @@ -0,0 +1,175 @@ +package com.lukouguoji.aerologic.page.coldStorage.list + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.lukouguoji.aerologic.R +import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.ColdStorageBean +import dev.utils.app.info.KeyValue +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.showToast +import com.lukouguoji.module_base.ktx.toRequestBody +import com.lukouguoji.module_base.model.ScanModel +import kotlinx.coroutines.launch + +/** + * 冷库登记 ViewModel + */ +class ColdStorageViewModel : BasePageViewModel() { + + // ========== 搜索条件 ========== + val ieFlag = MutableLiveData("") // 进出港标识 + val wbNo = MutableLiveData("") // 运单号 + val status = MutableLiveData("") // 货物状态 + val outUserName = MutableLiveData("") // 出库人 + val inUserName = MutableLiveData("") // 入库人 + + // ========== 下拉列表数据源 ========== + val ieFlagList = MutableLiveData>( + listOf( + KeyValue("全部", ""), + KeyValue("进港", "I"), + KeyValue("出港", "E") + ) + ) + val statusList = MutableLiveData>( + listOf( + KeyValue("全部", ""), + KeyValue("已入库", "已入库"), + KeyValue("已出库", "已出库") + ) + ) + + // ========== 统计信息 ========== + 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 = ColdStorageViewHolder::class.java + val itemLayoutId = R.layout.item_cold_storage + + /** + * 扫码运单号 + */ + fun scanWbNo() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + /** + * 搜索按钮点击 + */ + 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 completeIn() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择要入库的数据") + return + } + + launchLoadingCollect({ NetApply.api.coldStorageCompleteIn(selectedItems.toRequestBody()) }) { + onSuccess = { + showToast("入库完成") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } + } + + /** + * 完成出库 + */ + fun completeOut() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择要出库的数据") + return + } + + launchLoadingCollect({ NetApply.api.coldStorageCompleteOut(selectedItems.toRequestBody()) }) { + onSuccess = { + showToast("出库完成") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } + } + + /** + * 获取数据 + */ + override fun getData() { + val filterParams = mapOf( + "ieFlag" to ieFlag.value?.ifEmpty { null }, + "wbNo" to wbNo.value?.ifEmpty { null }, + "status" to status.value?.ifEmpty { null }, + "outUserName" to outUserName.value?.ifEmpty { null }, + "inUserName" to inUserName.value?.ifEmpty { null } + ) + + val listParams = (filterParams + mapOf( + "pageNum" to pageModel.page, + "pageSize" to pageModel.limit + )).toRequestBody() + + val totalParams = filterParams.toRequestBody() + + // 获取列表 + launchLoadingCollect({ NetApply.api.getColdStorageList(listParams) }) { + onSuccess = { pageModel.handleListBean(it?.toBaseListBean()) } + } + + // 获取统计信息 + launchCollect({ NetApply.api.getColdStorageTotal(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/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt b/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt index a041f27..ada138d 100644 --- a/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt +++ b/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt @@ -30,6 +30,7 @@ import com.lukouguoji.aerologic.page.telegram.list.TelegramListActivity import com.lukouguoji.aerologic.page.test.PrintActivity import com.lukouguoji.aerologic.page.transport.GoodsTransportActivity import com.lukouguoji.aerologic.page.transportLog.list.TransportLogActivity +import com.lukouguoji.aerologic.page.coldStorage.list.ColdStorageActivity import com.lukouguoji.aerologic.page.uld.list.UldListActivity import com.lukouguoji.gnc.page.deposit.list.GncDepositListActivity import com.lukouguoji.gnc.page.distribution.home.GncDistributionHomeActivity @@ -553,6 +554,10 @@ class HomeFragment : Fragment() { Constant.AuthName.ComprehensiveUld -> { UldListActivity.start(requireContext()) } + // 冷库登记 + Constant.AuthName.ComprehensiveColdStorage -> { + ColdStorageActivity.start(requireContext()) + } else -> { Toast.makeText( @@ -962,6 +967,13 @@ class HomeFragment : Fragment() { "ULD管理" ) ) + list.add( + RightMenu( + Constant.AuthName.ComprehensiveColdStorage, + com.lukouguoji.module_base.R.mipmap.gnc_cangku, + "冷库登记" + ) + ) } else -> { diff --git a/app/src/main/res/layout/activity_cold_storage.xml b/app/src/main/res/layout/activity_cold_storage.xml new file mode 100644 index 0000000..4f6551b --- /dev/null +++ b/app/src/main/res/layout/activity_cold_storage.xml @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_cold_storage.xml b/app/src/main/res/layout/item_cold_storage.xml new file mode 100644 index 0000000..afbb065 --- /dev/null +++ b/app/src/main/res/layout/item_cold_storage.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/ColdStorageBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/ColdStorageBean.kt new file mode 100644 index 0000000..d483a9d --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/ColdStorageBean.kt @@ -0,0 +1,26 @@ +package com.lukouguoji.module_base.bean + +import androidx.databinding.ObservableBoolean + +/** + * 冷库登记 Bean + */ +class ColdStorageBean { + var id: Long = 0 + var wbNo: String = "" // 运单号 + var pc: Int = 0 // 件数 + var wt: Double = 0.0 // 重量 + var inUserName: String = "" // 入库人 + var inDate: String = "" // 入库时间 + var outUserName: String = "" // 出库人 + var outDate: String = "" // 出库时间 + var storageDuration: String = "" // 在库时长 + var status: String = "" // 在库状态 + var ieFlag: String = "" // 进出港标识 + + // 多选状态 + val checked: ObservableBoolean = ObservableBoolean(false) + var isSelected: Boolean + get() = checked.get() + set(value) = checked.set(value) +} diff --git a/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt b/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt index 918d26e..b827f94 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt @@ -331,6 +331,9 @@ interface Constant { // ULD管理 const val ComprehensiveUld = "AppComprehensiveUld" + + // 冷库登记 + const val ComprehensiveColdStorage = "AppComprehensiveColdStorage" } } 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 eed9206..67af5fb 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 @@ -11,6 +11,7 @@ import com.lukouguoji.module_base.bean.BaseResultBean import com.lukouguoji.module_base.bean.BoxDetailsForCarIdBean import com.lukouguoji.module_base.bean.CarBarBean import com.lukouguoji.module_base.bean.CarOrUldBean +import com.lukouguoji.module_base.bean.ColdStorageBean import com.lukouguoji.module_base.bean.DiBangChannelBean import com.lukouguoji.module_base.bean.DictBean import com.lukouguoji.module_base.bean.DictIdValueBean @@ -1887,4 +1888,32 @@ interface Api { */ @POST("eqm/uld/deleteUld") suspend fun deleteUld(@Query("uld") uld: String): BaseResultBean + + /////////////////////////////////////////////////////////////////////////// + // 冷库登记 + /////////////////////////////////////////////////////////////////////////// + + /** + * 冷库登记-分页查询 + */ + @POST("ColdStorage/pageQuery") + suspend fun getColdStorageList(@Body data: RequestBody): PageInfo + + /** + * 冷库登记-分页合计 + */ + @POST("ColdStorage/pageQueryTotal") + suspend fun getColdStorageTotal(@Body data: RequestBody): BaseResultBean + + /** + * 冷库登记-完成入库 + */ + @POST("ColdStorage/completeIn") + suspend fun coldStorageCompleteIn(@Body data: RequestBody): BaseResultBean + + /** + * 冷库登记-完成出库 + */ + @POST("ColdStorage/completeOut") + suspend fun coldStorageCompleteOut(@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 4ee751c..72907d5 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 @@ -213,4 +213,7 @@ object ARouterConstants { const val ACTIVITY_URL_PDA_ENTER = "/pda/PDAEnterActivity" //PDA入口 + ///////////////// 综合管理 + const val ACTIVITY_URL_COLD_STORAGE = "/app/ColdStorageActivity" //冷库登记 + } \ No newline at end of file