feat: 国际事故签证新增支持运单号联想并自动带出舱单信息

- 运单号输入启用自动联想(1条自动填充、多条弹窗选择)
- 运单号满11位自动查询进港舱单,带出航班日期、航班号、始发/目的站、总件数、总重量、品名及交接图片
- 仅新增模式触发带出,避免编辑模式覆盖已保存数据和图片

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 16:31:16 +08:00
parent dcb335ecdf
commit aa6cc43bfa
5 changed files with 80 additions and 0 deletions

View File

@@ -12,6 +12,8 @@ data class GjjManifest(
var no: String = "", // 编号
var prefix: String = "", // 前缀
var wbNo: String = "", // 运单号
var fdate: String = "", // 航班日期
var fno: String = "", // 航班号
var origin: String = "", // 货源地(始发站)
var dest: String = "", // 目的站
var fdep: String = "", // 航班起始站

View File

@@ -1891,6 +1891,14 @@ interface Api {
@POST("IntImpManifest/pageQueryTotal")
suspend fun getIntImpManifestTotal(@Body data: RequestBody): BaseResultBean<ManifestTotalDto>
/**
* 国际进港舱单-根据11位具体运单号查询运单信息
* 接口路径: /IntImpManifest/queryWbByNo
* @param wbNo 11位运单号
*/
@POST("IntImpManifest/queryWbByNo")
suspend fun getIntImpManifestByWbNo(@Query("wbNo") wbNo: String): BaseResultBean<GjjManifest>
/**
* 国际进港舱单-获取主单下分单
*/

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.InputType
import androidx.core.widget.doOnTextChanged
import com.lukouguoji.gjj.R
import com.lukouguoji.gjj.databinding.ActivityIntImpAccidentVisaEditBinding
import com.lukouguoji.gjj.viewModel.IntImpAccidentVisaEditViewModel
@@ -29,6 +30,10 @@ class IntImpAccidentVisaEditActivity :
binding.fnoInput.et.setUpperCaseAlphanumericFilter()
// 运单号纯数字11位
binding.wbNoInput.et.inputType = InputType.TYPE_CLASS_NUMBER
// 运单号满11位后自动查询舱单信息带出表单数据覆盖手输、联想填充、弹窗选择
binding.wbNoInput.et.doOnTextChanged { text, _, _, _ ->
viewModel.onWbNoChanged(text?.toString()?.trim() ?: "")
}
viewModel.rv = binding.rv
binding.rv.addOnItemClickListener(viewModel)

View File

@@ -233,6 +233,65 @@ class IntImpAccidentVisaEditViewModel : BaseViewModel(), IOnItemClickListener {
}
}
///////////////////////////////////////////////////////////////////////////
// 运单号带出国际进港舱单信息
///////////////////////////////////////////////////////////////////////////
private var lastQueriedWbNo = ""
/**
* 运单号文本变化回调Activity 中监听输入框)
* 满11位且与上次查询不同时查询进港舱单信息并回填表单
* 仅新增模式生效:编辑模式下 loadDetail 回显运单号会触发本回调,
* 若不拦截会用舱单数据覆盖已保存的表单和图片列表
*/
fun onWbNoChanged(wbNo: String) {
if (pageType.value != DetailsPageType.Add) return
if (wbNo.length != 11) return
if (wbNo == lastQueriedWbNo) return
lastQueriedWbNo = wbNo
queryWbInfo(wbNo)
}
private fun queryWbInfo(wbNo: String) {
launchLoadingCollect({ NetApply.api.getIntImpManifestByWbNo(wbNo) }) {
onSuccess = {
val data = it.data
if (it.verifySuccess() && data != null) {
// 接口可能返回 null 字段Gson 反射注入会绕过 Kotlin 非空默认值),统一 noNull 防护
val b = dataBean.value ?: GjAccidentVisaEditBean()
b.fdate = data.fdate.noNull().take(10)
b.fno = data.fno.noNull()
b.dep = data.origin.noNull()
b.dest = data.dest.noNull()
b.pc = (if (data.totalPc > 0) data.totalPc else data.pc).toString()
b.weight = (if (data.totalWeight > 0.0) data.totalWeight else data.weight).toString()
b.goods = data.goods.noNull().ifEmpty { data.goodsCn.noNull() }
dataBean.value = b
// 与航班级联查询判重键同步,避免航班输入框失焦后重复查询覆盖带出的始发/目的站
lastQueriedFlight = "${b.fdate}-${b.fno}"
// 回填交接图片path 取原图完整 URL 用于预览url 取缩略图相对路径用于提交
val picList = data.pic.noNull().split(",").filter { p -> p.isNotEmpty() }
val originalList = data.originalPic.noNull().split(",").filter { p -> p.isNotEmpty() }
val images = picList.mapIndexed { index, picUrl ->
val originalUrl = originalList.getOrElse(index) { picUrl }
FileBean(
path = MediaUtil.fillUrl(originalUrl),
url = picUrl,
originalPic = originalUrl
)
}
// 重置图片区:舱单图片 + 末尾空白添加占位
rv?.commonAdapter()?.refresh(images + FileBean())
} else {
showToast(it.msg.noNull("未查询到该运单的进港舱单信息"))
}
}
}
}
///////////////////////////////////////////////////////////////////////////
// 保存
///////////////////////////////////////////////////////////////////////////

View File

@@ -118,6 +118,12 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
autoQueryEnabled="@{true}"
autoQueryMaxLength="@{8}"
autoQueryMinLength="@{8}"
autoQueryParamKey="@{`wbNo`}"
autoQueryTitle="@{`选择运单号`}"
autoQueryUrl="@{`/IntImpManifest/pageQueryWbNoList`}"
enable="@{!viewModel.isDetailMode}"
hint='@{"请输入运单号"}'
title='@{"运单号"}'