From af62041ef783ed29daaa4f9ee3d2d8a1e692f0df Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Mon, 17 Nov 2025 17:05:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E9=99=85=E5=87=BA=E6=B8=AF?= =?UTF-8?q?=E6=94=B6=E8=BF=90=E6=A3=80=E6=9F=A5=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_base/bean/ManifestTotalDto.kt | 12 +++ .../module_base/common/ConstantEvent.kt | 3 + .../lukouguoji/module_base/http/net/Api.kt | 14 +++ .../gjc/activity/GjcInspectionActivity.kt | 12 +++ .../gjc/holder/GjcInspectionViewHolder.kt | 9 ++ .../gjc/viewModel/GjcInspectionViewModel.kt | 83 +++++++++++++---- .../res/layout/activity_gjc_inspection.xml | 90 ++++++++++++------- .../main/res/layout/item_gjc_inspection.xml | 6 +- 8 files changed, 180 insertions(+), 49 deletions(-) create mode 100644 module_base/src/main/java/com/lukouguoji/module_base/bean/ManifestTotalDto.kt diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/ManifestTotalDto.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/ManifestTotalDto.kt new file mode 100644 index 0000000..c54ec76 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/ManifestTotalDto.kt @@ -0,0 +1,12 @@ +package com.lukouguoji.module_base.bean + +/** + * 舱单统计数据DTO + * 用于国际出港收运审核统计接口返回 + */ +data class ManifestTotalDto( + var wbNumber: Int = 0, // 运单票数/总票数 + var totalPc: Long = 0, // 总件数 + var totalWeight: Double = 0.0, // 总重量 + var cargoWeight: Double = 0.0 // 总货重 +) diff --git a/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt b/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt index 9cbf53d..43c657c 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt @@ -37,4 +37,7 @@ object ConstantEvent { // 通用刷新事件 const val EVENT_REFRESH = "event_refresh" + + // 复选框状态变化事件 + const val EVENT_CHECK_CHANGED = "event_check_changed" } \ No newline at end of file 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 4df13a1..ac766b0 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 @@ -43,6 +43,7 @@ import com.lukouguoji.module_base.bean.GncCunFangBean import com.lukouguoji.module_base.bean.GncDistributionBean import com.lukouguoji.module_base.bean.GncFuBangBean import com.lukouguoji.module_base.bean.GjcInspectionBean +import com.lukouguoji.module_base.bean.ManifestTotalDto import com.lukouguoji.module_base.bean.GncInspectionBean import com.lukouguoji.module_base.bean.GncQueryBean import com.lukouguoji.module_base.bean.GncQueryDetailsBean @@ -187,6 +188,12 @@ interface Api { @POST("typeCode/domExp/agentCode") suspend fun getGncAgentList(): DictListBean + /** + * 获取代理人-国际出港-下拉框 + */ + @POST("typeCode/intExp/agentCode") + suspend fun getIntExpAgentList(): DictListBean + /** * 获取业务类型---CI:国内进港,CO:国内出港,II:国际进港,IO:国际出港 下拉框 */ @@ -373,6 +380,13 @@ interface Api { @POST("IntExpCheckInCheck/audit") suspend fun auditGjcInspection(@Body data: RequestBody): BaseResultBean + /** + * 条件查询-国际出港-收运审核-统计数据(总件数、总重量、运单总数) + * 接口路径: /IntExpCheckInCheck/pageQueryTotal + */ + @POST("IntExpCheckInCheck/pageQueryTotal") + suspend fun getGjcInspectionTotal(@Body data: RequestBody): BaseResultBean + /////////////////////////////////////////////////////////////////////////// // 国际进-电报解析 /////////////////////////////////////////////////////////////////////////// diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionActivity.kt index 2b1ab22..8cea8ea 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionActivity.kt @@ -40,6 +40,18 @@ class GjcInspectionActivity : viewModel.refresh() } + // 监听checkbox状态变化事件 + FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED) + .observe(this) { + viewModel.onItemCheckChanged() + } + + // 监听全选状态变化,更新图标 + viewModel.isAllChecked.observe(this) { isAllChecked -> + // 通过alpha值表示全选状态:全选时alpha=1.0,未全选时alpha=0.5 + binding.checkIcon.alpha = if (isAllChecked) 1.0f else 0.5f + } + // 初始化代理列表 viewModel.initAgentList() diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt index e3498a4..b3d0be2 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt @@ -5,6 +5,11 @@ import android.view.View import com.lukouguoji.gjc.databinding.ItemGjcInspectionBinding import com.lukouguoji.module_base.base.BaseViewHolder import com.lukouguoji.module_base.bean.GjcInspectionBean +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch /** * 国际出港收运检查列表 ViewHolder @@ -19,6 +24,10 @@ class GjcInspectionViewHolder(view: View) : // 点击checkbox切换选中状态 binding.ivIcon.setOnClickListener { bean.checked.set(!bean.checked.get()) + // 发送checkbox状态变化事件 + CoroutineScope(Dispatchers.Main).launch { + FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).emit("check_changed") + } } // 设置审核状态文本和颜色 diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt index 0fe99b9..fc9b153 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt @@ -14,6 +14,7 @@ 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 @@ -24,6 +25,7 @@ import com.lukouguoji.module_base.model.ScanModel import com.lukouguoji.module_base.util.CheckUtil import dev.utils.app.info.KeyValue import kotlinx.coroutines.launch +import java.util.Date /** * 国际出港收运检查 ViewModel @@ -44,9 +46,8 @@ class GjcInspectionViewModel : BasePageViewModel() { val auditStatusList = MutableLiveData( listOf( KeyValue("全部", ""), - KeyValue("已通过", "1"), - KeyValue("退回", "2"), KeyValue("未审核", "0"), + KeyValue("通过", "1"), ) ) @@ -59,6 +60,14 @@ class GjcInspectionViewModel : BasePageViewModel() { val totalPc = MutableLiveData("0") // 总件数 val totalWeight = MutableLiveData("0") // 总重量 + // 全选状态 + val isAllChecked = MutableLiveData(false) + + init { + // 设置航班日期默认值为当前日期 + flightDate.value = Date().formatDate() + } + /////////////////////////////////////////////////////////////////////////// // 方法区 /////////////////////////////////////////////////////////////////////////// @@ -81,7 +90,8 @@ class GjcInspectionViewModel : BasePageViewModel() { * 获取列表数据 */ override fun getData() { - val body = mapOf( + // 构建查询参数(列表接口) + val listParams = mapOf( "pageNum" to pageModel.page, "pageSize" to pageModel.limit, "fdate" to flightDate.value!!.ifEmpty { null }, @@ -91,15 +101,33 @@ class GjcInspectionViewModel : BasePageViewModel() { "wbNo" to waybillNo.value!!.ifEmpty { null }, ).toRequestBody() + // 构建查询参数(统计接口 - 使用相同的搜索条件) + val totalParams = mapOf( + "fdate" to flightDate.value!!.ifEmpty { null }, + "fno" to flightNo.value!!.ifEmpty { null }, + "agentCode" to agentId.value!!.ifEmpty { null }, + "reviewStatus" to auditStatus.value!!.ifEmpty { null }, + "wbNo" to waybillNo.value!!.ifEmpty { null }, + ).toRequestBody() + + // 获取列表数据(显示loading) launchLoadingCollect({ - NetApply.api.getGjcInspectionList(body) + NetApply.api.getGjcInspectionList(listParams) }) { onSuccess = { pageModel.handleListBean(it) - // 更新统计数据(包含在返回结果中) - totalCount.value = (it.total ?: 0).toString() - totalPc.value = (it.totalPc ?: 0).toString() - totalWeight.value = (it.totalWeight ?: 0.0).toString() + } + } + + // 获取统计数据(后台调用,不显示loading) + launchCollect({ + NetApply.api.getGjcInspectionTotal(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() } } } @@ -179,19 +207,42 @@ class GjcInspectionViewModel : BasePageViewModel() { fun checkAllClick() { val list = pageModel.rv!!.commonAdapter()!!.items as List CheckUtil.handleAllCheck(list) + updateCheckAllStatus() + } + + /** + * 更新全选状态 + */ + fun updateCheckAllStatus() { + val list = pageModel.rv?.commonAdapter()?.items as? List + if (list != null && list.isNotEmpty()) { + isAllChecked.value = list.all { it.checked.get() } + } else { + isAllChecked.value = false + } + } + + /** + * 单个item点击事件(用于更新全选状态) + */ + fun onItemCheckChanged() { + updateCheckAllStatus() } /** * 初始化代理下拉列表(从API获取) */ fun initAgentList() { - // TODO: 调用API获取代理列表 - // 暂时使用模拟数据 - agentList.value = listOf( - KeyValue("全部", ""), - KeyValue("SF", "SF"), - KeyValue("YTO", "YTO"), - KeyValue("ZTO", "ZTO"), - ) + launchCollect({ + NetApply.api.getIntExpAgentList() + }) { + onSuccess = { result -> + val list = mutableListOf(KeyValue("全部", "")) + result.data?.forEach { + list.add(KeyValue(it.name ?: "", it.code ?: "")) + } + agentList.value = list + } + } } } diff --git a/module_gjc/src/main/res/layout/activity_gjc_inspection.xml b/module_gjc/src/main/res/layout/activity_gjc_inspection.xml index 78857f4..b5b5426 100644 --- a/module_gjc/src/main/res/layout/activity_gjc_inspection.xml +++ b/module_gjc/src/main/res/layout/activity_gjc_inspection.xml @@ -94,30 +94,6 @@ - - - - - - - - - - + + + + + + + + + + + android:layout_marginLeft="20dp" + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + + + +