diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e7077a..aa9a1ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -124,6 +124,17 @@ android:configChanges="orientation|keyboardHidden" android:exported="false" android:screenOrientation="userLandscape" /> + + + ? = null // idList(获取收运记录列表) - var billsNo: Any? = null // 账单号 + var cityName: String = "" // 城市名称 + var proName: String = "" // 省份名称 + var areaName: String = "" // 区域名称 + + // 关联列表(可选,根据需要使用) + var haWbList: List? = null // 分单列表 + var storageUseList: List? = null // 库位使用列表 + var attachList: List? = null // 附件列表 } diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcWeighingRecordBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcWeighingRecordBean.kt new file mode 100644 index 0000000..6b04602 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcWeighingRecordBean.kt @@ -0,0 +1,99 @@ +package com.lukouguoji.module_base.bean + +/** + * 国际出港计重记录-列表数据Bean + * 对应API: IntExpCheckIn/checked/pageQuery + * 对应API返回类型: GjcWarehouse + */ +class GjcWeighingRecordBean { + var whId: Long = 0 // 仓库主键ID + var no: String = "" // 运单号 + var prefix: String = "" // 运单前缀 + var wbNo: String = "" // 11位运单号 + var oldNo: String = "" // 旧运单号 + var oldPrefix: String = "" // 旧运单前缀 + + var agentCode: String = "" // 代理人code + var agentName: String = "" // 代理人名称 + + var fid: Long = 0 // 航班主键id + var fdate: String = "" // 航班日期 + var fno: String = "" // 航班号 + var flight: String = "" // 航班: 航班日期/航班号 + var fclose: String = "" // 航班关闭时间 + var scheduledTackOff: String = "" // 计划起飞时间 + var scheduledArrival: String = "" // 预计到达时间 + + var range: String = "" // 航程 + var dep: String = "" // 始发站 + var dest: String = "" // 最终目的站 + var dest1: String = "" // 第一目的站 + var dest2: String = "" // 第二目的站 + + var pc: Long = 0 // 预配件数 + var weight: Double = 0.0 // 预配重量 + var volume: Double = 0.0 // 预配体积 + + var checkInPc: Long = 0 // 入库件数 + var checkInWeight: Double = 0.0 // 入库重量 + var checkInVolume: Double = 0.0 // 入库体积 + + var spCode: String = "" // 特码 + var subCode: String = "" // 子码 + var goods: String = "" // 品名(英) + var goodsCn: String = "" // 品名(中) + var businessType: String = "" // 业务类型 + var businessName: String = "" // 业务类型名称(中) + var awbType: String = "" // 运单类型 + var awbName: String = "" // 运单类型名称(中) + + var checkIn: String = "" // 收运状态。0:待收运,1:已收运,2:收运中 + var reviewStatus: String = "" // 审核状态(0:未审核;1:通过;2:退回) + var declareStatus: String = "" // 申报状态 + + var carId: String = "" // 平板车号 + var carNumber: String = "" // 车牌号 + var cargoType: String = "" // 货物类型 + var packageType: String = "" // 包装类型 + var origin: String = "" // 货源地 + var unNumber: String = "" // UN编号 + + var consignee: String = "" // 收货人 + var cneeTel: String = "" // 收货人电话 + + var by0: String = "" // 第一承运人 + var by1: String = "" // 第二承运人 + var by2: String = "" // 第三承运人 + + var opId: String = "" // 操作员id + var opDate: String = "" // 操作时间(入库时间) + var paperTime: String = "" // 单据时间 + + var userName: String = "" // 收运人 + var userId: String = "" // 收运人ID + + var remark: String = "" // 备注 + var ffmMemo: String = "" // ffm备注 + var mftMemo: String = "" // mft备注 + var billsNo: String = "" // 提单号 + + var haWbNumber: Int = 0 // 分单数 + var storageUseNumber: Int = 0 // 库位使用数 + var recheckCount: Long = 0 // 复核次数 + + var customsLib: String = "" // 代理人lib + var tranFlag: String = "" // 转运标识 + var activeId: Long = 0 // 有效值 + + var cityName: String = "" // 城市名称 + var proName: String = "" // 省份名称 + var areaName: String = "" // 区域名称 + + var location: String = "" // 库位 + var carWeight: String = "" // 平板车重量 + + // 关联列表(可选,根据需要使用) + var haWbList: List? = null // 分单列表 + var storageUseList: List? = null // 库位使用列表 + var attachList: List? = null // 附件列表 +} 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 77f7a9f..178d17e 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 @@ -30,6 +30,7 @@ import com.lukouguoji.module_base.bean.GjcUldUseBean import com.lukouguoji.module_base.bean.GjcWaybillBean import com.lukouguoji.module_base.bean.GjcWaybillDataBean import com.lukouguoji.module_base.bean.GjcWeighingBean +import com.lukouguoji.module_base.bean.GjcWeighingRecordBean import com.lukouguoji.module_base.bean.GjcWeighingStatisticsBean import com.lukouguoji.module_base.bean.GjjGoodsBean import com.lukouguoji.module_base.bean.GjjGoodsDetailsBean @@ -442,18 +443,39 @@ interface Api { suspend fun submitGjcBoxWeighing(@Body data: RequestBody): BaseResultBean /** - * 国际出港计重-分页搜索 - * 接口路径: /IntExpCheckIn/checked/pageQuery + * 国际出港待计重-分页搜索 + * 接口路径: /IntExpCheckIn/pageQuery */ - @POST("IntExpCheckIn/checked/pageQuery") + @POST("IntExpCheckIn/pageQuery") suspend fun getGjcWeighingList(@Body data: RequestBody): BaseListBean /** - * 国际出港计重-条件查询总件数、总重量、运单总数 + * 国际出港待计重-条件查询总件数、总重量、运单总数 + * 接口路径: /IntExpCheckIn/pageQueryTotal + */ + @POST("IntExpCheckIn/pageQueryTotal") + suspend fun getGjcWeighingStatistics(@Body data: RequestBody): BaseResultBean + + /** + * 国际出港计重记录-分页搜索 + * 接口路径: /IntExpCheckIn/checked/pageQuery + */ + @POST("IntExpCheckIn/checked/pageQuery") + suspend fun getGjcWeighingRecordList(@Body data: RequestBody): BaseListBean + + /** + * 国际出港计重记录-条件查询总件数、总重量、运单总数 * 接口路径: /IntExpCheckIn/checked/pageQueryTotal */ @POST("IntExpCheckIn/checked/pageQueryTotal") - suspend fun getGjcWeighingStatistics(@Body data: RequestBody): BaseResultBean + suspend fun getGjcWeighingRecordStatistics(@Body data: RequestBody): BaseResultBean + + /** + * 国际出港待计重-开始计重-完成 + * 接口路径: /IntExpCheckIn/completeCheckIn + */ + @POST("IntExpCheckIn/completeCheckIn") + suspend fun completeCheckIn(@Body data: RequestBody): BaseResultBean /////////////////////////////////////////////////////////////////////////// // 国际进-电报解析 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 2c9f0d5..dec0554 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 @@ -120,6 +120,8 @@ object ARouterConstants { const val ACTIVITY_URL_GJC_BOX_WEIGHING_ADD = "/gjc/GjcBoxWeighingAddActivity" //国际出港模块 添加过磅 const val ACTIVITY_URL_GJC_WEIGHING_LIST = "/gjc/GjcWeighingListActivity" //国际出港模块 出港计重 + const val ACTIVITY_URL_GJC_WEIGHING_START = "/gjc/GjcWeighingStartActivity" //国际出港模块 开始计重 + const val ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST = "/gjc/GjcWeighingRecordListActivity" //国际出港模块 计重记录 const val ACTIVITY_URL_GJC_WARE_HOUSE = "/gjc/GjcWareHouseActivity" //国际出港模块 仓库 const val ACTIVITY_URL_GJC_WARE_HOUSE_INFO = "/gjc/GjcWareHouseInfoActivity" //国际出港模块 仓库详情 diff --git a/module_base/src/main/res/drawable/bg_primary_stroke_radius_4.xml b/module_base/src/main/res/drawable/bg_primary_stroke_radius_4.xml new file mode 100644 index 0000000..8eb4544 --- /dev/null +++ b/module_base/src/main/res/drawable/bg_primary_stroke_radius_4.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt index 51320e8..3708fa2 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt @@ -26,7 +26,7 @@ class GjcWeighingListActivity : override fun viewModelClass() = GjcWeighingViewModel::class.java override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("出港计重") + setBackArrow("出港待计重") binding.viewModel = viewModel diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt new file mode 100644 index 0000000..7231c63 --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt @@ -0,0 +1,54 @@ +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordListBinding +import com.lukouguoji.gjc.viewModel.GjcWeighingRecordViewModel +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_GJC_WEIGHING_RECORD_LIST) +class GjcWeighingRecordListActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_weighing_record_list + + override fun viewModelClass() = GjcWeighingRecordViewModel::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.refresh() + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, GjcWeighingRecordListActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt new file mode 100644 index 0000000..6530ac5 --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt @@ -0,0 +1,44 @@ +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcWeighingStartBinding +import com.lukouguoji.gjc.viewModel.GjcWeighingStartViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国际出港计重-开始计重页面 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_START) +class GjcWeighingStartActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_weighing_start + + override fun viewModelClass() = GjcWeighingStartViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("开始计重") + binding.viewModel = viewModel + viewModel.initOnCreated(this, intent) + } + + companion object { + /** + * 启动开始计重页面 + * @param context 上下文 + * @param maWbId 运单ID + */ + @JvmStatic + fun startForAdd(context: Context, maWbId: Long) { + val starter = Intent(context, GjcWeighingStartActivity::class.java) + .putExtra(Constant.Key.MAWB_ID, maWbId) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingRecordViewHolder.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingRecordViewHolder.kt new file mode 100644 index 0000000..970a655 --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingRecordViewHolder.kt @@ -0,0 +1,24 @@ +package com.lukouguoji.gjc.holder + +import android.view.View +import com.lukouguoji.gjc.databinding.ItemGjcWeighingRecordBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GjcWeighingRecordBean + +/** + * 国际出港计重记录列表 ViewHolder + */ +class GjcWeighingRecordViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item)!! + binding.bean = bean + + // 整行点击跳转到详情页(暂未实现) + binding.ll.setOnClickListener { + // TODO: 跳转到详情页(待实现) + // GjcWeighingRecordDetailsActivity.start(it.context, bean.whId) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingViewHolder.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingViewHolder.kt index 69a1258..2665729 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingViewHolder.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcWeighingViewHolder.kt @@ -1,6 +1,7 @@ package com.lukouguoji.gjc.holder import android.view.View +import com.lukouguoji.gjc.activity.GjcWeighingStartActivity import com.lukouguoji.gjc.databinding.ItemGjcWeighingBinding import com.lukouguoji.module_base.base.BaseViewHolder import com.lukouguoji.module_base.bean.GjcWeighingBean @@ -15,10 +16,9 @@ class GjcWeighingViewHolder(view: View) : val bean = getItemBean(item)!! binding.bean = bean - // 整行点击跳转到详情页(暂未实现) + // 整行点击跳转到开始计重页面 binding.ll.setOnClickListener { - // TODO: 跳转到详情页(待实现) - // GjcWeighingDetailsActivity.start(it.context, bean.whId) + GjcWeighingStartActivity.startForAdd(it.context, bean.maWbId) } } } diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingRecordViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingRecordViewModel.kt new file mode 100644 index 0000000..ebe7f3f --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingRecordViewModel.kt @@ -0,0 +1,134 @@ +package com.lukouguoji.gjc.viewModel + +import android.app.Activity +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.holder.GjcWeighingRecordViewHolder +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.toRequestBody +import com.lukouguoji.module_base.model.ScanModel + +/** + * 国际出港计重记录 ViewModel + */ +class GjcWeighingRecordViewModel : BasePageViewModel() { + + // 搜索条件 + val flightDate = MutableLiveData("") // 航班日期 + val flightNo = MutableLiveData("") // 航班号 + val agentCode = MutableLiveData("") // 代理人 + val spCode = MutableLiveData("") // 特码 + val waybillNo = MutableLiveData("") // 运单号 + + // 适配器配置 + val itemViewHolder = GjcWeighingRecordViewHolder::class.java + val itemLayoutId = R.layout.item_gjc_weighing_record + + // 统计数据 + val totalCount = MutableLiveData("0") // 合计票数 + val totalPc = MutableLiveData("0") // 总件数 + val totalWeight = MutableLiveData("0") // 总重量 + val cargoWeight = MutableLiveData("0") // 总货重 + + /////////////////////////////////////////////////////////////////////////// + // 方法区 + /////////////////////////////////////////////////////////////////////////// + + /** + * 扫码输入航班号 + */ + fun flightNoScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.FLIGHT_NO) + } + + /** + * 扫码输入运单号 + */ + fun waybillNoScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + /** + * 搜索按钮点击 + */ + fun searchClick() { + refresh() + } + + /** + * 运抵申报按钮点击(暂未实现) + */ + fun declareClick() { + // TODO: 跳转到运抵申报页面(待实现) + } + + /** + * 获取列表数据 + */ + override fun getData() { + // 构建查询参数(列表接口) + val listParams = mapOf( + "pageNum" to pageModel.page, + "pageSize" to pageModel.limit, + "fdate" to flightDate.value!!.ifEmpty { null }, + "fno" to flightNo.value!!.ifEmpty { null }, + "agentCode" to agentCode.value!!.ifEmpty { null }, + "spCode" to spCode.value!!.ifEmpty { null }, + "likeNo" to waybillNo.value!!.ifEmpty { null }, + ).toRequestBody() + + // 构建查询参数(统计接口 - 使用相同的搜索条件) + val totalParams = mapOf( + "fdate" to flightDate.value!!.ifEmpty { null }, + "fno" to flightNo.value!!.ifEmpty { null }, + "agentCode" to agentCode.value!!.ifEmpty { null }, + "spCode" to spCode.value!!.ifEmpty { null }, + "likeNo" to waybillNo.value!!.ifEmpty { null }, + ).toRequestBody() + + // 获取列表数据(显示loading) + launchLoadingCollect({ + NetApply.api.getGjcWeighingRecordList(listParams) + }) { + onSuccess = { + pageModel.handleListBean(it) + } + } + + // 获取统计数据(后台调用,不显示loading) + launchCollect({ + NetApply.api.getGjcWeighingRecordStatistics(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() + cargoWeight.value = (data?.cargoWeight ?: 0.0).toString() + } + } + } + + /** + * 处理扫码结果 + */ + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK && data != null) { + when (requestCode) { + Constant.RequestCode.FLIGHT_NO -> { + flightNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT) + refresh() + } + Constant.RequestCode.WAYBILL -> { + waybillNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT) + refresh() + } + } + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingStartViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingStartViewModel.kt new file mode 100644 index 0000000..31b3f4d --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingStartViewModel.kt @@ -0,0 +1,323 @@ +package com.lukouguoji.gjc.viewModel + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.lukouguoji.module_base.base.BaseViewModel +import com.lukouguoji.module_base.bean.GjcWeighingBean +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.http.net.DiBangWeightModel +import com.lukouguoji.module_base.http.net.NetApply +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.ktx.formatDate +import com.lukouguoji.module_base.ktx.getActivity +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.ktx.verifyNullOrEmpty +import com.lukouguoji.module_base.model.ScanModel +import com.lukouguoji.module_base.util.Common +import com.lukouguoji.module_base.util.DictUtils +import dev.utils.app.info.KeyValue +import kotlinx.coroutines.launch +import java.util.Calendar +import java.util.Date + +/** + * 国际出港计重-开始计重 ViewModel + */ +class GjcWeighingStartViewModel : BaseViewModel() { + + // 运单ID(从列表页传入) + var maWbId: Long = 0 + + // 数据Bean + val dataBean = MutableLiveData(GjcWeighingBean()) + + // 地磅集成 + val diBangModel = DiBangWeightModel() + val channel = MutableLiveData("") // 通道号(用于控制地磅key) + + // 地磅称重显示 + val diBangWeight = MutableLiveData("0") // 地磅重量(右上角黄色显示区域) + + // 可编辑字段(用于双向绑定) + val realTimePc = MutableLiveData("") // 实时件数 + val realTimeWeight = MutableLiveData("") // 实时重量 + val realTimeVolume = MutableLiveData("") // 实时体积 + val arrivePc = MutableLiveData("") // 运抵件数 + val arriveWeight = MutableLiveData("") // 运抵重量 + val arriveVolume = MutableLiveData("") // 运抵体积 + + // 下拉选择数据源 + val channelList = MutableLiveData>() // 通道号列表 + val agentList = MutableLiveData>() // 代理人列表 + val spCodeList = MutableLiveData>() // 特码列表 + val businessTypeList = MutableLiveData>() // 业务类型列表 + + // 托盘车自重(查询获取) + val carWeight = MutableLiveData("0") + + /** + * 初始化 + */ + fun initOnCreated(activity: Activity, intent: Intent) { + // 获取传入的运单ID + maWbId = intent.getLongExtra(Constant.Key.MAWB_ID, 0) + + // 监听地磅重量变化 + diBangModel.weight.observe(activity as LifecycleOwner) { weight -> + val w = weight?.toDoubleOrNull() ?: 0.0 + diBangWeight.value = if (w > 0) String.format("%.0f", w) else "0" + } + + // 监听通道号变化,设置地磅的key + channel.observe(activity as LifecycleOwner) { + diBangModel.key = it ?: "" + } + + // 加载下拉列表数据 + loadChannelList() + loadAgentList() + loadSpCodeList() + loadBusinessTypeList() + + // 加载运单数据 + if (maWbId > 0) { + loadWeighingData() + } + } + + /** + * 加载通道号列表 + */ + private fun loadChannelList() { + DictUtils.getChannelList { + channelList.value = it + } + } + + /** + * 加载代理人列表 + */ + private fun loadAgentList() { + DictUtils.getAgentList { + agentList.value = it + } + } + + /** + * 加载特码列表 + */ + private fun loadSpCodeList() { + // TODO: 从字典获取特码列表 + spCodeList.value = listOf() + } + + /** + * 加载业务类型列表 + */ + private fun loadBusinessTypeList() { + // TODO: 从字典获取业务类型列表 + businessTypeList.value = listOf() + } + + /** + * 加载运单数据 + */ + private fun loadWeighingData() { + val params = mapOf( + "maWbId" to maWbId + ).toRequestBody() + + launchCollect({ + // 使用查询接口获取运单详情(暂时使用列表接口,传入maWbId过滤) + NetApply.api.getGjcWeighingList(params) + }) { + onSuccess = { + if (it.list?.isNotEmpty() == true) { + val bean = it.list!![0] + dataBean.value = bean + + // 填充可编辑字段 + realTimePc.value = if (bean.pc > 0) bean.pc.toString() else "" + realTimeWeight.value = if (bean.weight > 0) bean.weight.toString() else "" + realTimeVolume.value = if (bean.volume > 0) bean.volume.toString() else "" + arrivePc.value = if (bean.arrivePc > 0) bean.arrivePc.toString() else "" + arriveWeight.value = if (bean.arriveWeight > 0) bean.arriveWeight.toString() else "" + arriveVolume.value = if (bean.arriveVolume > 0) bean.arriveVolume.toString() else "" + } + } + } + } + + /** + * 航班日期点击 + */ + fun flightDateClick(view: View) { + Common.onYearMonthDay(view.context.getActivity(), dataBean.value?.fdate) { year, month, day -> + val calendar = Calendar.getInstance() + calendar.set(year, month - 1, day) + val date = calendar.time.formatDate() + dataBean.value = dataBean.value?.apply { fdate = date } + } + } + + /** + * 运单号扫码 + */ + fun waybillScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + /** + * 航班号扫码 + */ + fun flightScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.FLIGHT_NO) + } + + /** + * 托盘车号扫码 + */ + fun carIdScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.CAR) + } + + /** + * 托盘车号输入后查询自重 + */ + fun queryCarWeight(carId: String) { + if (carId.isEmpty()) { + carWeight.value = "0" + return + } + + val params = mapOf( + "carId" to carId + ).toRequestBody() + + launchCollect({ + // 查询托盘车自重接口(待确认具体接口) + // 暂时使用模拟数据 + // NetApply.api.queryCarWeight(params) + carWeight.value = "0" // 模拟返回 + }) { + onSuccess = { + // carWeight.value = it.data?.weight?.toString() ?: "0" + } + } + } + + /** + * 分拣计重按钮点击 + */ + fun sortingWeighingClick() { + showToast("分拣计重功能开发中") + // TODO: 实现分拣计重功能 + } + + /** + * 完成计重按钮点击 + */ + fun completeCheckInClick() { + val bean = dataBean.value ?: return + + // 验证必填字段 + if (bean.no.verifyNullOrEmpty("请输入运单号")) return + if (bean.fno.verifyNullOrEmpty("请输入航班号")) return + + // 从编辑字段获取数值 + val pc = realTimePc.value?.toLongOrNull() ?: bean.pc + val weight = realTimeWeight.value?.toDoubleOrNull() ?: bean.weight + val volume = realTimeVolume.value?.toDoubleOrNull() ?: bean.volume + val arrivePcVal = arrivePc.value?.toLongOrNull() ?: bean.arrivePc + val arriveWeightVal = arriveWeight.value?.toDoubleOrNull() ?: bean.arriveWeight + val arriveVolumeVal = arriveVolume.value?.toDoubleOrNull() ?: bean.arriveVolume + + // 提交数据到接口 + val params = mapOf( + "maWbId" to bean.maWbId, + "no" to bean.no, + "prefix" to bean.prefix, + "wbNo" to bean.wbNo, + "agentCode" to bean.agentCode, + "agentName" to bean.agentName, + "fid" to bean.fid, + "fdate" to bean.fdate, + "fno" to bean.fno, + "flight" to bean.flight, + "range" to bean.range, + "dep" to bean.dep, + "dest" to bean.dest, + "dest1" to bean.dest1, + "dest2" to bean.dest2, + "pc" to pc, + "weight" to weight, + "volume" to volume, + "arrivePc" to arrivePcVal, + "arriveWeight" to arriveWeightVal, + "arriveVolume" to arriveVolumeVal, + "spCode" to bean.spCode, + "goods" to bean.goods, + "goodsCn" to bean.goodsCn, + "businessType" to bean.businessType, + "carId" to bean.carId, + "remark" to bean.remark, + "checkIn" to "1" // 收运状态设置为已收运 + ).toRequestBody(removeEmptyOrNull = true) + + launchLoadingCollect({ + NetApply.api.completeCheckIn(params) + }) { + onSuccess = { result -> + if (result.verifySuccess()) { + showToast("计重完成") + // 发送刷新事件 + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + getTopActivity().finish() + } else { + showToast(result.msg.noNull("计重失败")) + } + } + } + } + + /** + * 处理扫码结果 + */ + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK && data != null) { + val content = data.getStringExtra(Constant.Result.CODED_CONTENT).noNull() + when (requestCode) { + Constant.RequestCode.WAYBILL -> { + dataBean.value = dataBean.value?.apply { no = content } + } + Constant.RequestCode.FLIGHT_NO -> { + dataBean.value = dataBean.value?.apply { fno = content } + } + Constant.RequestCode.CAR -> { + dataBean.value = dataBean.value?.apply { carId = content } + // 查询托盘车自重 + queryCarWeight(content) + } + } + } + } + + /** + * 清理资源 + */ + override fun onCleared() { + super.onCleared() + diBangModel.cancelLooperGet() + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingViewModel.kt index 52af674..9c74f60 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcWeighingViewModel.kt @@ -4,12 +4,15 @@ import android.app.Activity import android.content.Intent import androidx.lifecycle.MutableLiveData import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.activity.GjcWeighingRecordListActivity +import com.lukouguoji.gjc.activity.GjcWeighingStartActivity import com.lukouguoji.gjc.holder.GjcWeighingViewHolder 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 @@ -61,17 +64,19 @@ class GjcWeighingViewModel : BasePageViewModel() { } /** - * 添加按钮点击(暂未实现) + * 添加按钮点击(跳转到开始计重页面) */ fun addClick() { - // TODO: 跳转到添加页面(待实现) +// showToast("请从列表中选择一条待计重运单") + + GjcWeighingStartActivity.startForAdd(getTopActivity(), 123) } /** - * 计重记录按钮点击(暂未实现) + * 计重记录按钮点击 */ fun recordClick() { - // TODO: 跳转到计重记录页面(待实现) + GjcWeighingRecordListActivity.start(getTopActivity()) } /** diff --git a/module_gjc/src/main/res/layout/activity_gjc_weighing_record_list.xml b/module_gjc/src/main/res/layout/activity_gjc_weighing_record_list.xml new file mode 100644 index 0000000..479841c --- /dev/null +++ b/module_gjc/src/main/res/layout/activity_gjc_weighing_record_list.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml b/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml new file mode 100644 index 0000000..356cf7e --- /dev/null +++ b/module_gjc/src/main/res/layout/activity_gjc_weighing_start.xml @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml b/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml new file mode 100644 index 0000000..488f068 --- /dev/null +++ b/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +