feat: 国际事故签证新增支持运单号联想并自动带出舱单信息
- 运单号输入启用自动联想(1条自动填充、多条弹窗选择) - 运单号满11位自动查询进港舱单,带出航班日期、航班号、始发/目的站、总件数、总重量、品名及交接图片 - 仅新增模式触发带出,避免编辑模式覆盖已保存数据和图片 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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 = "", // 航班起始站
|
||||
|
||||
@@ -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>
|
||||
|
||||
/**
|
||||
* 国际进港舱单-获取主单下分单
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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("未查询到该运单的进港舱单信息"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// 保存
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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='@{"运单号"}'
|
||||
|
||||
Reference in New Issue
Block a user