diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt index af2d51a..7184390 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjcUldUseBean.kt @@ -51,6 +51,7 @@ class GjcUldUseBean : Serializable { var uldFlag: String = "" // uld分类 var status: String = "" // uld状态:0:正常,1:故障 var dgrCode: String = "" // IMP代码 + var bupFlag: String = "" // BUP选项(0:否;1:是) var height: String = "" // 高度 var passageway: String = "" // 通道号 var passagewayId: String = "" diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/UldInfoBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/UldInfoBean.kt index bb9a1ff..9435f21 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/bean/UldInfoBean.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/UldInfoBean.kt @@ -13,4 +13,7 @@ class UldInfoBean { var totalWeight: String = "" // 总重量 var status: String = "" // 状态(旧字段,保留兼容) var useId: Long? = null // ULD使用ID(来自getUld接口) + var dgrCode: String = "" // IMP代码 + var boardType: String = "" // 板型(可下拉选择,也可手动输入) + var bupFlag: String = "0" // BUP选项(0:否;1:是),默认否 } 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 bd40a8e..a5980a9 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 @@ -666,7 +666,8 @@ interface Api { * 国际出港组装 - 根据全ULD查询ULD状态和耗材重量 * 接口路径: /IntExpAssemble/getUld * @param uld ULD编号 - * @return ULD信息,包含status(0:正常,1:故障)和consumeWeight(耗材重量) + * @return ULD信息,包含status(0:正常,1:故障)、consumeWeight(耗材重量)、 + * dgrCode(IMP代码)、boardType(板型)、bupFlag(BUP选项 0:否;1:是) */ @GET("IntExpAssemble/getUld") suspend fun getUldWithConsumeWeight(@Query("uld") uld: String): BaseResultBean @@ -675,7 +676,8 @@ interface Api { * 国际出港组装 - 卸货 * 接口路径: /IntExpAssemble/drop * @param data 请求参数:abPc(组装件数)、abWeight(组装重量)、consumeWeight(耗材重量)、 - * ldId(组装人)、loadArea(组装区)、useInfo(ULD信息)、wbInfo(运单信息)、userId(用户ID) + * ldId(组装人)、loadArea(组装区)、useInfo(ULD信息)、wbInfo(运单信息)、userId(用户ID)、 + * dgrCode(IMP代码)、boardType(板型)、bupFlag(BUP选项 0:否;1:是) */ @POST("IntExpAssemble/drop") suspend fun assembleDropCargo(@Body data: RequestBody): BaseResultBean @@ -684,7 +686,8 @@ interface Api { * 国际出港组装 - 装货 * 接口路径: /IntExpAssemble/assemble * @param data 请求参数:abPc(组装件数)、abWeight(组装重量)、consumeWeight(耗材重量)、 - * ldId(组装人)、loadArea(组装区)、useInfo(ULD信息)、wbInfo(运单信息)、userId(用户ID) + * ldId(组装人)、loadArea(组装区)、useInfo(ULD信息)、wbInfo(运单信息)、userId(用户ID)、 + * dgrCode(IMP代码)、boardType(板型)、bupFlag(BUP选项 0:否;1:是) */ @POST("IntExpAssemble/assemble") suspend fun assembleLoadCargo(@Body data: RequestBody): BaseResultBean diff --git a/module_base/src/main/java/com/lukouguoji/module_base/util/DictUtils.kt b/module_base/src/main/java/com/lukouguoji/module_base/util/DictUtils.kt index 60eff64..8a53a3b 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/util/DictUtils.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/util/DictUtils.kt @@ -625,6 +625,21 @@ object DictUtils { } } + /** + * 板型列表(国际出港组装-开始组装) + * 字典 code:BOARDTYPE;显示与提交均使用 value 字段 + */ + fun getBoardTypeList(callBack: (List) -> Unit) { + launchCollect({ + NetApply.api + .getDictList("BOARDTYPE") + }) { + onSuccess = { + callBack((it.data ?: emptyList()).map { b -> KeyValue(b.value, b.value) }) + } + } + } + // 报文类型 fun getTelegramTypeList(callBack: (List) -> Unit) { launchCollect({ diff --git a/module_base/src/main/res/drawable/bg_data_layout_new_dropdown.xml b/module_base/src/main/res/drawable/bg_data_layout_new_dropdown.xml new file mode 100644 index 0000000..600bc05 --- /dev/null +++ b/module_base/src/main/res/drawable/bg_data_layout_new_dropdown.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt index 4eebe3b..a69fe51 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/page/assemble/IntExpAssembleStartActivity.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import com.alibaba.android.arouter.facade.annotation.Route import com.lukouguoji.gjc.R @@ -66,8 +67,17 @@ class IntExpAssembleStartActivity : setBackArrow("国际出港开始组装") binding.viewModel = viewModel - // 为ULD编号添加大写字母和数字的输入限制 + // 为ULD编号、IMP代码添加大写字母和数字的输入限制 binding.uldNoInput.et.setUpperCaseAlphanumericFilter() + binding.impCodeInput.et.setUpperCaseAlphanumericFilter() + + // 板型:手动输入 + 下拉选择组合框。箭头复用 Spinner 同款背景绘制(同资源、同尺寸、同边距), + // 图标位不放图片,仅作为覆盖在箭头上的透明点击区域(点击事件由布局 setOnIconClickListener 绑定) + binding.boardTypeInput.apply { + ll.setBackgroundResource(com.lukouguoji.module_base.R.drawable.bg_data_layout_new_dropdown) + iv.setImageDrawable(null) + iv.visibility = View.VISIBLE + } // 初始化列表 initRecyclerViews() @@ -81,6 +91,9 @@ class IntExpAssembleStartActivity : // 加载组装人列表 viewModel.loadAssemblerList() + // 加载板型选项列表 + viewModel.loadBoardTypeList() + // 监听登出事件,清空缓存 FlowBus.with(ConstantEvent.LOGOUT).observe(this) { viewModel.clearCachedOperator() diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt index 3aec990..b037493 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpAssembleStartViewModel.kt @@ -2,6 +2,7 @@ package com.lukouguoji.gjc.viewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope +import com.alibaba.fastjson.JSONArray import com.lukouguoji.gjc.R import com.lukouguoji.gjc.holder.AssembleInfoViewHolder import com.lukouguoji.gjc.holder.AssemblePositionViewHolder @@ -16,8 +17,11 @@ import com.lukouguoji.module_base.impl.FlowBus 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.toJson import com.lukouguoji.module_base.ktx.toRequestBody 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 @@ -75,6 +79,12 @@ class IntExpAssembleStartViewModel : BaseViewModel() { // ========== 组装人列表 ========== val assemblerList = MutableLiveData>(emptyList()) + // ========== BUP选项(0:否;1:是),默认否 ========== + val bupFlagList = listOf(KeyValue("否", "0"), KeyValue("是", "1")) + + // ========== 板型选项(字典;支持下拉选择,也支持手动输入)========== + val boardTypeList = MutableLiveData>(emptyList()) + // ========== 标记位,避免重复查询 ========== private var lastQueriedUldNo = "" @@ -404,6 +414,37 @@ class IntExpAssembleStartViewModel : BaseViewModel() { } + /** + * 加载板型选项列表(字典) + */ + fun loadBoardTypeList() { + DictUtils.getBoardTypeList { boardTypeList.value = it } + } + + /** + * 板型下拉图标点击:弹出选项列表,选中后回填到板型输入框(回填后仍可手动修改) + */ + fun onBoardTypeSelectClick() { + val list = boardTypeList.value ?: emptyList() + if (list.isEmpty()) { + showToast("暂无板型选项,请手动输入") + return + } + val jsonArray = JSONArray.parseArray( + list.map { mapOf("name" to it.key, "code" to it.value) }.toJson(false) + ) + Common.singleSelect( + getTopActivity(), + "选择板型", + jsonArray, + uldInfo.value?.boardType + ) { position, _ -> + uldInfo.value = uldInfo.value?.apply { + boardType = list.getOrNull(position)?.value ?: "" + } + } + } + /** * ULD编号输入完成时调用 */ @@ -438,6 +479,10 @@ class IntExpAssembleStartViewModel : BaseViewModel() { } // 保存useId(用于装货/卸货接口) useId = uldBean.useId + // 回填 IMP代码 / 板型 / BUP:服务端有值时覆盖(修改模式回显),为空时保留当前输入 + if (!uldBean.dgrCode.isNullOrEmpty()) dgrCode = uldBean.dgrCode + if (!uldBean.boardType.isNullOrEmpty()) boardType = uldBean.boardType + if (!uldBean.bupFlag.isNullOrEmpty()) bupFlag = uldBean.bupFlag } // 【新增】从ULD信息提取航班信息 @@ -606,9 +651,17 @@ class IntExpAssembleStartViewModel : BaseViewModel() { val loadAreaId = selectedPosition.value?.positionCode?.trim() ?: "" + // IMP代码 / 板型 / BUP(接口新增字段,useInfo 与顶层参数均需携带) + val dgrCode = uldInfo.value?.dgrCode?.trim() ?: "" + val boardType = uldInfo.value?.boardType?.trim() ?: "" + val bupFlag = uldInfo.value?.bupFlag?.ifEmpty { "0" } ?: "0" + // 2. 构建useInfo(ULD信息) val useInfo = mapOf( "uld" to uldNo, + "dgrCode" to dgrCode.ifEmpty { null }, + "boardType" to boardType.ifEmpty { null }, + "bupFlag" to bupFlag, "consumeWeight" to materialWeight.toDoubleOrNull(), "status" to when (uldInfo.value?.uldStatus) { "正常" -> "0" @@ -693,6 +746,9 @@ class IntExpAssembleStartViewModel : BaseViewModel() { "ldId" to operatorValue, "loadArea" to loadArea, "loadAreaId" to loadAreaId.ifEmpty { null }, // 组装位置ID + "dgrCode" to dgrCode.ifEmpty { null }, // IMP代码 + "boardType" to boardType.ifEmpty { null }, // 板型 + "bupFlag" to bupFlag, // BUP选项(0:否;1:是) "useInfo" to useInfo, "wbInfo" to wbInfo, "userId" to SharedPreferenceUtil.getString(Constant.Share.account) diff --git a/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml b/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml index d2cafe5..5876db6 100644 --- a/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml +++ b/module_gjc/src/main/res/layout/activity_int_exp_assemble_start.xml @@ -293,6 +293,54 @@ android:layout_height="wrap_content" android:layout_weight="1" /> + + + + + + + + + +