From 1476f1368af3addf421505536b63fb6a62f70319 Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Sun, 8 Mar 2026 16:14:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E9=99=85=E8=BF=9B=E6=B8=AF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=90=E5=8F=96=E5=87=BA=E5=BA=93=E5=92=8C?= =?UTF-8?q?=E8=BF=9B=E6=B8=AF=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD=E9=A1=B5?= =?UTF-8?q?=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 | 14 + .../aerologic/ui/fragment/HomeFragment.kt | 26 ++ .../module_base/bean/IntImpPickUpDLVBean.kt | 62 ++++ .../module_base/bean/IntImpQueryBean.kt | 57 ++++ .../lukouguoji/module_base/common/Constant.kt | 1 + .../lukouguoji/module_base/http/net/Api.kt | 37 +++ .../module_base/router/ARouterConstants.kt | 1 + .../gjj/activity/GjjQueryListActivity.kt | 2 +- .../gjj/activity/IntImpPickUpDLVActivity.kt | 57 ++++ .../gjj/activity/IntImpQueryActivity.kt | 51 ++++ .../dialog/IntImpQueryFilterDialogModel.kt | 87 ++++++ .../gjj/holder/IntImpPickUpDLVViewHolder.kt | 26 ++ .../gjj/holder/IntImpQueryViewHolder.kt | 19 ++ .../gjj/viewModel/IntImpPickUpDLVViewModel.kt | 183 ++++++++++++ .../gjj/viewModel/IntImpQueryViewModel.kt | 161 +++++++++++ .../layout/activity_int_imp_pick_up_dlv.xml | 197 +++++++++++++ .../res/layout/activity_int_imp_query.xml | 177 ++++++++++++ .../layout/dialog_int_imp_query_filter.xml | 153 ++++++++++ .../res/layout/item_int_imp_pick_up_dlv.xml | 271 +++++++++++++++++ .../main/res/layout/item_int_imp_query.xml | 273 ++++++++++++++++++ 20 files changed, 1854 insertions(+), 1 deletion(-) create mode 100644 module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpPickUpDLVBean.kt create mode 100644 module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpQueryBean.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpPickUpDLVActivity.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpQueryActivity.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpQueryFilterDialogModel.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpPickUpDLVViewHolder.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpQueryViewHolder.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpPickUpDLVViewModel.kt create mode 100644 module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpQueryViewModel.kt create mode 100644 module_gjj/src/main/res/layout/activity_int_imp_pick_up_dlv.xml create mode 100644 module_gjj/src/main/res/layout/activity_int_imp_query.xml create mode 100644 module_gjj/src/main/res/layout/dialog_int_imp_query_filter.xml create mode 100644 module_gjj/src/main/res/layout/item_int_imp_pick_up_dlv.xml create mode 100644 module_gjj/src/main/res/layout/item_int_imp_query.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 853ae5d..739be5d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -440,6 +440,20 @@ android:exported="false" android:screenOrientation="userLandscape" /> + + + + + + 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 3357900..054eed6 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 @@ -463,6 +463,18 @@ class HomeFragment : Fragment() { .navigation() } + // 提取出库 + Constant.AuthName.IntImpPickUpDLV -> { + ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_INT_IMP_PICK_UP_DLV) + .navigation() + } + + // 进港查询 + Constant.AuthName.GjjQueryListActivity -> { + ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_QUERY_LIST) + .navigation() + } + /** * 航班查询 */ @@ -826,6 +838,20 @@ class HomeFragment : Fragment() { "提取记录" ) ) + list.add( + RightMenu( + Constant.AuthName.IntImpPickUpDLV, + R.mipmap.gnj_cang_ku_icon, + "提取出库" + ) + ) + list.add( + RightMenu( + Constant.AuthName.GjjQueryListActivity, + R.mipmap.img_bwjx, + "进港查询" + ) + ) } Constant.AuthName.Flight -> { diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpPickUpDLVBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpPickUpDLVBean.kt new file mode 100644 index 0000000..137ae92 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpPickUpDLVBean.kt @@ -0,0 +1,62 @@ +package com.lukouguoji.module_base.bean + +import androidx.databinding.ObservableBoolean +import java.io.Serializable + +/** + * 国际进港提取出库-列表数据Bean + * 对应API: IntImpPickUpDlv/pageQuery + */ +class IntImpPickUpDLVBean : Serializable { + var id: Long = 0 // 主键ID + var wbNo: String = "" // 运单号 + var no: String = "" // 主单号 + var prefix: String = "" // 主单前缀 + var hno: String = "" // 分单号 + var agentCode: String = "" // 代理人代码 + var agentName: String = "" // 代理人名称 + var flight: String = "" // 航班信息 + var fno: String = "" // 航班号 + var fdate: String = "" // 航班日期 + var pc: Long = 0 // 件数 + var weight: Double = 0.0 // 重量 + var cashWeight: Double = 0.0 // 计费重量 + var pkId: String = "" // 提货编号(提货单号) + var location: String = "" // 库位 + var chargeTime: String = "" // 缴费时间(提取时间) + var dlvTime: String = "" // 出库时间 + var goods: String = "" // 品名 + var spCode: String = "" // 特码 + var pickFlag: String = "" // 提取出库标识 + var chargeFlag: String = "" // 提取标识 + var serialNo: Long = 0 // 收费记录项目序号 + var amount: Double = 0.0 // 总金额 + var optCharge: Double = 0.0 // 服务费 + var whsCharge: Double = 0.0 // 仓储费 + var tranCharge: Double = 0.0 // 信息费 + var drawBillCharge: Double = 0.0 // 抽单费 + var efrCharge: Double = 0.0 // 冷藏费 + var svlCharge: Double = 0.0 // 铲车费 + var tallyCharge: Double = 0.0 // 理货费 + var chargeId: String = "" // 收费员 + var chargeName: String = "" // 收费员名称 + var dlvId: String = "" + var dlvIdType: String = "" + var dlvName: String = "" + var dlvPhone: String = "" + var locFlag: String = "" + var origin: String = "" + var refId: String = "" + var receiptNo: String = "" + var chgMode: String = "" + var billReviewStatus: String = "" + var billAgentRemark: String = "" + var awbPc: Long = 0 + + // ========== UI扩展字段 ========== + 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/bean/IntImpQueryBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpQueryBean.kt new file mode 100644 index 0000000..a32ea69 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/IntImpQueryBean.kt @@ -0,0 +1,57 @@ +package com.lukouguoji.module_base.bean + +/** + * 国际进港查询-主运单数据模型 + * 对应接口:/IntImpSearch/pageQuery 返回的列表项 (GjjSearchMaWb) + */ +data class IntImpQueryBean( + var maWbId: Long? = null, // 主单主键ID + var wbNo: String? = null, // 运单号 + var prefix: String? = null, // 运单号前缀 + var no: String? = null, // 运单号主体 + + // ==================== 货物信息 ==================== + var awbPc: Long? = null, // 运单件数 + var awbWeight: Double? = null, // 运单重量 + var inPc: Long? = null, // 入库件数 + var inWeight: Double? = null, // 入库重量 + var cashWeight: Double? = null, // 计费重量 + var goods: String? = null, // 品名(英) + var goodsCn: String? = null, // 品名(中) + var packageType: String? = null, // 包装类型 + var unNumber: String? = null, // UN编号 + + // ==================== 航班信息 ==================== + var flight: String? = null, // 航班: 日期/航班号 + var fno: String? = null, // 航班号 + var fdate: String? = null, // 航班日期 + var range: String? = null, // 航程 (如 LAX-HFE) + var dest: String? = null, // 目的地 + var origin: String? = null, // 货源地 + var by1: String? = null, // 承运人 + + // ==================== 代理与运单类型 ==================== + var agentCode: String? = null, // 代理人code + var agentName: String? = null, // 代理人名称 + var awbType: String? = null, // 运单类型code + var awbName: String? = null, // 运单类型名称 + var businessType: String? = null, // 业务类型code + var businessName: String? = null, // 业务类型名称 + + // ==================== 特码 ==================== + var spCode: String? = null, // 特码 + + // ==================== 时间信息 ==================== + var inDate: String? = null, // 入库时间 + var dlvTime: String? = null, // 出库时间 + + // ==================== 状态信息 ==================== + var mftStatus: String? = null, // 原始舱单状态 + var tallyStatus: String? = null, // 理货申报状态 + var lockState: Int? = null, // 锁定状态(0:未锁, 1:锁定) + var command: String? = null, // 海关放行 + + // ==================== 其他 ==================== + var remark: String? = null, // 备注 + var activeId: Long? = null // 有效值 +) 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 29d3206..62c543d 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 @@ -271,6 +271,7 @@ interface Constant { const val IntImpManifest = "AppIntImpManifest" //进港舱单 const val IntImpTally = "AppIntImpTally" //理货报告 const val IntImpPickUpRecord = "AppIntImpPickUpRecord" //提取记录 + const val IntImpPickUpDLV = "AppIntImpPickUpDLV" //提取出库 const val GjjManifestListActivity = "AppIntExpManifest" //舱单 const val GjjTallyListActivity = "AppIntExpTally" //理货 const val GjjGoodsListActivity = "AppIntExpGjjGoods" //货物交接 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 9524cea..5a8469b 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 @@ -50,7 +50,9 @@ import com.lukouguoji.module_base.bean.GjjGoodsDetailsBean import com.lukouguoji.module_base.bean.GjjGoodsTypeBean import com.lukouguoji.module_base.bean.GjjHandoverRecordBean import com.lukouguoji.module_base.bean.GjjImportTally +import com.lukouguoji.module_base.bean.IntImpPickUpDLVBean import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean +import com.lukouguoji.module_base.bean.IntImpQueryBean import com.lukouguoji.module_base.bean.GjjManifest import com.lukouguoji.module_base.bean.GjjManifestBean import com.lukouguoji.module_base.bean.GjjPackTypeBean @@ -969,6 +971,41 @@ interface Api { @POST("IntImpPickUpRecord/getDetails") suspend fun getIntImpPickUpRecordDetails(@Body data: RequestBody): BaseResultBean + /** + * 国际进港提取出库-分页查询 + * 接口路径: /IntImpPickUpDlv/pageQuery + */ + @POST("IntImpPickUpDlv/pageQuery") + suspend fun getIntImpPickUpDLVList(@Body data: RequestBody): PageInfo + + /** + * 国际进港提取出库-分页合计 + * 接口路径: /IntImpPickUpDlv/pageQueryTotal + */ + @POST("IntImpPickUpDlv/pageQueryTotal") + suspend fun getIntImpPickUpDLVTotal(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港提取出库-确认出库 + * 接口路径: /IntImpPickUpDlv/pickUpOut + */ + @POST("IntImpPickUpDlv/pickUpOut") + suspend fun confirmIntImpPickUpDLV(@Body data: RequestBody): BaseResultBean + + /** + * 国际进港查询-分页 + * 接口路径: /IntImpSearch/pageQuery + */ + @POST("IntImpSearch/pageQuery") + suspend fun getIntImpQueryList(@Body data: RequestBody): PageInfo + + /** + * 国际进港查询-分页合计 + * 接口路径: /IntImpSearch/pageQueryTotal + */ + @POST("IntImpSearch/pageQueryTotal") + suspend fun getIntImpQueryTotal(@Body data: RequestBody): BaseResultBean + /** * 国际出港待计重-分页搜索 * 接口路径: /IntExpCheckIn/pageQuery 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 f893b95..2855742 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 @@ -177,6 +177,7 @@ object ARouterConstants { const val ACTIVITY_URL_INT_IMP_MANIFEST = "/gjj/IntImpManifestActivity" //国际进港 进港舱单 const val ACTIVITY_URL_INT_IMP_LOADING_LIST = "/gjj/IntImpLoadingListActivity" //国际进港 装机单(分拣理货) const val ACTIVITY_URL_INT_IMP_TALLY = "/gjj/IntImpTallyActivity" //国际进港 理货报告 + const val ACTIVITY_URL_INT_IMP_PICK_UP_DLV = "/gjj/IntImpPickUpDLVActivity" //国际进港 提取出库 ///////////////// 航班查询模块 /** diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjQueryListActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjQueryListActivity.kt index 036d879..6474425 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjQueryListActivity.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjQueryListActivity.kt @@ -27,7 +27,7 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout import java.text.SimpleDateFormat import java.util.* -@Route(path = ARouterConstants.ACTIVITY_URL_GJJ_QUERY_LIST) +//@Route(path = ARouterConstants.ACTIVITY_URL_GJJ_QUERY_LIST) class GjjQueryListActivity : BaseActivity(), View.OnClickListener { private val currentTitleName = "国际进港查询" diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpPickUpDLVActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpPickUpDLVActivity.kt new file mode 100644 index 0000000..62175f9 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpPickUpDLVActivity.kt @@ -0,0 +1,57 @@ +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.ActivityIntImpPickUpDlvBinding +import com.lukouguoji.gjj.viewModel.IntImpPickUpDLVViewModel +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.router.ARouterConstants + +/** + * 国际进港-提取出库 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_INT_IMP_PICK_UP_DLV) +class IntImpPickUpDLVActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_int_imp_pick_up_dlv + override fun viewModelClass() = IntImpPickUpDLVViewModel::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.initAgentList() + + // 初始加载数据 + viewModel.refresh() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + viewModel.onActivityResult(requestCode, resultCode, data) + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpQueryActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpQueryActivity.kt new file mode 100644 index 0000000..ca937c9 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpQueryActivity.kt @@ -0,0 +1,51 @@ +package com.lukouguoji.gjj.activity + +import android.content.Context +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.ActivityIntImpQueryBinding +import com.lukouguoji.gjj.viewModel.IntImpQueryViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +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.getLifecycleOwner +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国际进港查询列表页 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJJ_QUERY_LIST) +class IntImpQueryActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_int_imp_query + + override fun viewModelClass() = IntImpQueryViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("进港查询") + + binding.viewModel = viewModel + + viewModel.pageModel + .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) + + FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { + viewModel.refresh() + } + + viewModel.initAgentList() + + viewModel.refresh() + } + + companion object { + @JvmStatic + fun start(context: Context) { + context.startActivity(Intent(context, IntImpQueryActivity::class.java)) + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpQueryFilterDialogModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpQueryFilterDialogModel.kt new file mode 100644 index 0000000..f290ba9 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/dialog/IntImpQueryFilterDialogModel.kt @@ -0,0 +1,87 @@ +package com.lukouguoji.gjj.dialog + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.databinding.DialogIntImpQueryFilterBinding +import com.lukouguoji.module_base.base.BaseDialogModel +import com.lxj.xpopup.XPopup +import com.lxj.xpopup.enums.PopupPosition +import dev.DevUtils +import dev.utils.app.info.KeyValue + +/** + * 国际进港查询筛选抽屉 + */ +class IntImpQueryFilterDialogModel( + val spCode: MutableLiveData, + val flightNo: MutableLiveData, + val dest: MutableLiveData, + val awbType: MutableLiveData, + val businessType: MutableLiveData, + val goodsCn: MutableLiveData, + private val onConfirm: () -> Unit +) : BaseDialogModel(DIALOG_TYPE_DRAWER) { + + val awbTypeList = MutableLiveData( + listOf( + KeyValue("全部", ""), + KeyValue("主单", "1"), + KeyValue("分单", "2") + ) + ) + + val businessTypeList = MutableLiveData( + listOf( + KeyValue("全部", ""), + KeyValue("普货", "1"), + KeyValue("特货", "2") + ) + ) + + override fun layoutId() = R.layout.dialog_int_imp_query_filter + + override fun onBuild(builder: XPopup.Builder) { + super.onBuild(builder) + builder.popupPosition(PopupPosition.Right) + val activity = DevUtils.getTopActivity() + val activityWidth = activity.window.decorView.width + builder.maxWidth(activityWidth / 3) + builder.popupWidth(activityWidth / 3) + } + + override fun onDialogCreated(context: Context) { + binding.model = this + binding.lifecycleOwner = context as? androidx.lifecycle.LifecycleOwner + + val titleColor = Color.parseColor("#666666") + binding.root.findViewById(R.id.title_name)?.text = "筛选条件" + binding.root.findViewById(R.id.title_name)?.setTextColor(titleColor) + binding.root.findViewById(R.id.tool_tv_back)?.setTextColor(titleColor) + binding.root.findViewById(R.id.tool_iv_back)?.imageTintList = ColorStateList.valueOf(titleColor) + binding.root.findViewById(R.id.toolbar)?.setBackgroundColor(Color.WHITE) + + binding.root.findViewById(R.id.tool_back)?.setOnClickListener { + dismiss() + } + } + + fun onResetClick() { + spCode.value = "" + flightNo.value = "" + dest.value = "" + awbType.value = "" + businessType.value = "" + goodsCn.value = "" + } + + fun onConfirmClick() { + dismiss() + onConfirm() + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpPickUpDLVViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpPickUpDLVViewHolder.kt new file mode 100644 index 0000000..8d4614f --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpPickUpDLVViewHolder.kt @@ -0,0 +1,26 @@ +package com.lukouguoji.gjj.holder + +import android.view.View +import com.lukouguoji.gjj.databinding.ItemIntImpPickUpDlvBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.IntImpPickUpDLVBean + +/** + * 国际进港-提取出库 列表项ViewHolder + */ +class IntImpPickUpDLVViewHolder(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/holder/IntImpQueryViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpQueryViewHolder.kt new file mode 100644 index 0000000..a4b7d42 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpQueryViewHolder.kt @@ -0,0 +1,19 @@ +package com.lukouguoji.gjj.holder + +import android.view.View +import com.lukouguoji.gjj.databinding.ItemIntImpQueryBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.IntImpQueryBean + +/** + * 国际进港查询列表ViewHolder + */ +class IntImpQueryViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item)!! + binding.bean = bean + binding.executePendingBindings() + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpPickUpDLVViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpPickUpDLVViewModel.kt new file mode 100644 index 0000000..21f0ceb --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpPickUpDLVViewModel.kt @@ -0,0 +1,183 @@ +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.IntImpPickUpDLVViewHolder +import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.IntImpPickUpDLVBean +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 dev.utils.app.info.KeyValue +import kotlinx.coroutines.launch + +/** + * 国际进港-提取出库 ViewModel + */ +class IntImpPickUpDLVViewModel : BasePageViewModel() { + + // ========== 搜索条件 ========== + val paymentDateStart = MutableLiveData("") // 缴费日期起 + val paymentDateEnd = MutableLiveData("") // 缴费日期止 + val agentCode = MutableLiveData("") // 代理人 + val wbNo = MutableLiveData("") // 运单号 + val pickUpNo = MutableLiveData("") // 提货单号 + + // ========== 下拉列表数据源 ========== + val agentList = MutableLiveData(listOf(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 = IntImpPickUpDLVViewHolder::class.java + val itemLayoutId = R.layout.item_int_imp_pick_up_dlv + + /** + * 初始化代理人列表 + */ + 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 searchClick() { + refresh() + } + + /** + * 扫码运单号 + */ + fun scanWbNo() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + /** + * 扫码提货单号 + */ + fun scanPickUpNo() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.gnj_chu_ku_list) + } + + /** + * 全选按钮点击 + */ + 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 confirmOutbound() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择要出库的记录") + return + } + + launchLoadingCollect({ NetApply.api.confirmIntImpPickUpDLV(selectedItems.toRequestBody()) }) { + onSuccess = { + showToast("确认出库成功") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } + } + + /** + * 获取列表数据 + */ + override fun getData() { + val filterParams = mapOf( + "beginDate" to paymentDateStart.value?.ifEmpty { null }, + "endDate" to paymentDateEnd.value?.ifEmpty { null }, + "agentCode" to agentCode.value?.ifEmpty { null }, + "no" to wbNo.value?.ifEmpty { null }, + "pkId" to pickUpNo.value?.ifEmpty { null } + ) + + val listParams = (filterParams + mapOf( + "page" to pageModel.page, + "limit" to pageModel.limit + )).toRequestBody() + + val totalParams = filterParams.toRequestBody() + + launchLoadingCollect({ NetApply.api.getIntImpPickUpDLVList(listParams) }) { + onSuccess = { result -> + pageModel.handleDataList(result.list) + pageModel.haveMore.postValue((result.pages) > pageModel.page) + } + } + + launchCollect({ NetApply.api.getIntImpPickUpDLVTotal(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() + } + Constant.RequestCode.gnj_chu_ku_list -> { + pickUpNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT) + refresh() + } + } + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpQueryViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpQueryViewModel.kt new file mode 100644 index 0000000..859d096 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpQueryViewModel.kt @@ -0,0 +1,161 @@ +package com.lukouguoji.gjj.viewModel + +import android.app.Activity +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.dialog.IntImpQueryFilterDialogModel +import com.lukouguoji.gjj.holder.IntImpQueryViewHolder +import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.http.net.NetApply +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 dev.utils.app.info.KeyValue +import dev.utils.common.DateUtils +import com.lukouguoji.module_base.ktx.formatDate + +/** + * 国际进港查询ViewModel + */ +class IntImpQueryViewModel : BasePageViewModel() { + + // ==================== 搜索条件 ==================== + val flightDateStart = MutableLiveData(DateUtils.getCurrentTime().formatDate()) + val flightDateEnd = MutableLiveData("") + val agentId = MutableLiveData("") + val outStatus = MutableLiveData("") + val waybillNo = MutableLiveData("") + + // ==================== 下拉列表 ==================== + val agentList = MutableLiveData(listOf(KeyValue("全部", ""))) + + val outStatusList = MutableLiveData( + listOf( + KeyValue("全部", ""), + KeyValue("未出库", "0"), + KeyValue("已出库", "1") + ) + ) + + // ==================== 适配器配置 ==================== + val itemViewHolder = IntImpQueryViewHolder::class.java + val itemLayoutId = R.layout.item_int_imp_query + + // ==================== 统计数据 ==================== + val totalCount = MutableLiveData("0") + val totalPc = MutableLiveData("0") + val totalWeight = MutableLiveData("0") + + // ==================== 筛选条件 ==================== + val spCode = MutableLiveData("") + val flightNo = MutableLiveData("") + val dest = MutableLiveData("") + val awbType = MutableLiveData("") + val businessType = MutableLiveData("") + val goodsCn = MutableLiveData("") + + /////////////////////////////////////////////////////////////////////////// + // 方法区 + /////////////////////////////////////////////////////////////////////////// + + fun waybillScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + fun searchClick() { + refresh() + } + + fun filterClick() { + val filterDialog = IntImpQueryFilterDialogModel( + spCode = spCode, + flightNo = flightNo, + dest = dest, + awbType = awbType, + businessType = businessType, + goodsCn = goodsCn, + onConfirm = { refresh() } + ) + filterDialog.show() + } + + override fun getData() { + val listParams = mapOf( + "pageNum" to pageModel.page, + "pageSize" to pageModel.limit, + "beginDate" to flightDateStart.value!!.ifEmpty { null }, + "endDate" to flightDateEnd.value!!.ifEmpty { null }, + "agentCode" to agentId.value!!.ifEmpty { null }, + "outState" to outStatus.value!!.ifEmpty { null }, + "wbNo" to waybillNo.value!!.ifEmpty { null }, + "spCode" to spCode.value!!.ifEmpty { null }, + "fno" to flightNo.value!!.ifEmpty { null }, + "dest" to dest.value!!.ifEmpty { null }, + "awbType" to awbType.value!!.ifEmpty { null }, + "businessType" to businessType.value!!.ifEmpty { null }, + "goods" to goodsCn.value!!.ifEmpty { null } + ).toRequestBody() + + val totalParams = mapOf( + "beginDate" to flightDateStart.value!!.ifEmpty { null }, + "endDate" to flightDateEnd.value!!.ifEmpty { null }, + "agentCode" to agentId.value!!.ifEmpty { null }, + "outState" to outStatus.value!!.ifEmpty { null }, + "wbNo" to waybillNo.value!!.ifEmpty { null }, + "spCode" to spCode.value!!.ifEmpty { null }, + "fno" to flightNo.value!!.ifEmpty { null }, + "dest" to dest.value!!.ifEmpty { null }, + "awbType" to awbType.value!!.ifEmpty { null }, + "businessType" to businessType.value!!.ifEmpty { null }, + "goods" to goodsCn.value!!.ifEmpty { null } + ).toRequestBody() + + launchLoadingCollect({ + NetApply.api.getIntImpQueryList(listParams) + }) { + onSuccess = { pageInfo -> + pageModel.handleListBean(pageInfo.toBaseListBean()) + } + } + + launchCollect({ + NetApply.api.getIntImpQueryTotal(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 -> { + waybillNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT) + refresh() + } + } + } + } + + 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 + } + } + } +} diff --git a/module_gjj/src/main/res/layout/activity_int_imp_pick_up_dlv.xml b/module_gjj/src/main/res/layout/activity_int_imp_pick_up_dlv.xml new file mode 100644 index 0000000..004369b --- /dev/null +++ b/module_gjj/src/main/res/layout/activity_int_imp_pick_up_dlv.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/activity_int_imp_query.xml b/module_gjj/src/main/res/layout/activity_int_imp_query.xml new file mode 100644 index 0000000..d269a6a --- /dev/null +++ b/module_gjj/src/main/res/layout/activity_int_imp_query.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/dialog_int_imp_query_filter.xml b/module_gjj/src/main/res/layout/dialog_int_imp_query_filter.xml new file mode 100644 index 0000000..f4d9a02 --- /dev/null +++ b/module_gjj/src/main/res/layout/dialog_int_imp_query_filter.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/item_int_imp_pick_up_dlv.xml b/module_gjj/src/main/res/layout/item_int_imp_pick_up_dlv.xml new file mode 100644 index 0000000..567c9ae --- /dev/null +++ b/module_gjj/src/main/res/layout/item_int_imp_pick_up_dlv.xml @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/item_int_imp_query.xml b/module_gjj/src/main/res/layout/item_int_imp_query.xml new file mode 100644 index 0000000..b6fdad2 --- /dev/null +++ b/module_gjj/src/main/res/layout/item_int_imp_query.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +