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 0417d6d..84b28df 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 @@ -456,6 +456,33 @@ class IntExpAssembleStartViewModel : BaseViewModel() { } } + /** + * 重新查询 ULD 信息,仅回填最新的 useId 与 ULD 状态。 + * + * 用途:以"新增"形式进入页面、对全新 ULD 首次装货时,服务端在首票成功后才生成 + * 该 ULD 的 use 记录(useId)。装货/卸货接口返回值(GjcWarehouse)不含 useId, + * 若不回填,后续票仍以 useId=null 提交,会被服务端当作新的 use 处理, + * 导致无法继续往同一 ULD 组装多票。此处在每次操作成功后回填最新 useId, + * 保证多票组装提交到同一 ULD use 记录。 + * + * 不在此处刷新航班/组装信息列表,避免与 loadAssembledList 的航班兜底逻辑相互覆盖。 + */ + private fun reloadUldUseId(uldNo: String) { + if (uldNo.isEmpty()) return + launchCollect({ NetApply.api.getUldWithConsumeWeight(uldNo) }) { + onSuccess = { result -> + val uldBean = result.data + if (uldBean != null) { + // 仅回填 useId(用于后续装货/卸货提交到同一 ULD use 记录), + // 不改动 ULD 状态/耗材重量/航班等其它字段,避免影响表单现有逻辑。 + uldInfo.value = uldInfo.value?.apply { + useId = uldBean.useId + } + } + } + } + } + /** * 卸货按钮点击 */ @@ -589,6 +616,10 @@ class IntExpAssembleStartViewModel : BaseViewModel() { // 3. 【修改】区分 wbInfo 构建 val wbInfo: Map + // 记录本次操作运单的航班信息(用于操作成功后刷新组装信息列表) + var operationFno = "" + var operationFdate = "" + if (isLoad) { // 装货:从运单列表获取 val currentWaybillList = waybillList.value @@ -615,6 +646,9 @@ class IntExpAssembleStartViewModel : BaseViewModel() { selectedWaybill.weight.toDoubleOrNull() } + operationFno = selectedWaybill.fno + operationFdate = selectedWaybill.fdate + wbInfo = mapOf( "wbNo" to selectedWaybill.waybillNo, "pc" to waybillPc, @@ -631,6 +665,9 @@ class IntExpAssembleStartViewModel : BaseViewModel() { return } + operationFno = assembleWaybill.fno + operationFdate = assembleWaybill.fdate + wbInfo = mapOf( "wbNo" to assembleWaybill.waybillNo, "pc" to assembleWaybill.pieces.toLongOrNull(), // 运单件数 @@ -665,7 +702,7 @@ class IntExpAssembleStartViewModel : BaseViewModel() { }) { onSuccess = { result -> // 接口成功后才显示成功提示并刷新列表 - handleOperationSuccess(operationName, isLoad, uldNo, assembleCount, assembleWeight) + handleOperationSuccess(operationName, uldNo, operationFno, operationFdate) } onFailed = { code, message -> showToast("${operationName}失败: $message") @@ -678,10 +715,9 @@ class IntExpAssembleStartViewModel : BaseViewModel() { */ private fun handleOperationSuccess( operationName: String, - isLoad: Boolean, uldNo: String, - assembleCount: String, - assembleWeight: String + operationFno: String, + operationFdate: String ) { showToast("${operationName}成功") @@ -693,6 +729,26 @@ class IntExpAssembleStartViewModel : BaseViewModel() { // 清空表单(在刷新数据前清空,避免刷新时的状态冲突) clearForm() + // 回填最新 useId(关键):以"新增"形式进入、对全新 ULD 首票装货时, + // 服务端在首票成功后才生成该 ULD 的 use 记录,而装货/卸货接口返回值不含 useId。 + // 若不回填,后续票仍以 useId=null 提交,会被服务端当作新的 use 处理, + // 导致无法继续往同一 ULD 组装多票。 + // 仅在本地 useId 尚未生成(为 0)时回填;"修改"模式及已过磅 ULD 本就带 useId,保持原逻辑不变。 + if ((uldInfo.value?.useId ?: 0L) == 0L) { + reloadUldUseId(uldNo) + } + + // 添加形式(全新 ULD)时航班可能未从 ULD 查询接口获取,导致组装信息列表查不出; + // 仅在航班为空时用本次操作运单的航班信息兜底补全,ULD 已带航班时保持原值不变。 + if (assembleFlightNo.value.isNullOrEmpty() || assembleFlightDate.value.isNullOrEmpty()) { + if (operationFno.isNotEmpty() && operationFdate.isNotEmpty()) { + assembleFlightNo.value = operationFno + // 与 ULD 查询保持一致,只取年月日(去掉时间部分) + assembleFlightDate.value = + if (operationFdate.contains(" ")) operationFdate.split(" ")[0] else operationFdate + } + } + // 清除防抖标记,强制刷新组装信息列表 lastQueriedAssembledParams = "" loadAssembledList()