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 no: String = "", // 编号
|
||||||
var prefix: String = "", // 前缀
|
var prefix: String = "", // 前缀
|
||||||
var wbNo: String = "", // 运单号
|
var wbNo: String = "", // 运单号
|
||||||
|
var fdate: String = "", // 航班日期
|
||||||
|
var fno: String = "", // 航班号
|
||||||
var origin: String = "", // 货源地(始发站)
|
var origin: String = "", // 货源地(始发站)
|
||||||
var dest: String = "", // 目的站
|
var dest: String = "", // 目的站
|
||||||
var fdep: String = "", // 航班起始站
|
var fdep: String = "", // 航班起始站
|
||||||
|
|||||||
@@ -1891,6 +1891,14 @@ interface Api {
|
|||||||
@POST("IntImpManifest/pageQueryTotal")
|
@POST("IntImpManifest/pageQueryTotal")
|
||||||
suspend fun getIntImpManifestTotal(@Body data: RequestBody): BaseResultBean<ManifestTotalDto>
|
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.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.InputType
|
import android.text.InputType
|
||||||
|
import androidx.core.widget.doOnTextChanged
|
||||||
import com.lukouguoji.gjj.R
|
import com.lukouguoji.gjj.R
|
||||||
import com.lukouguoji.gjj.databinding.ActivityIntImpAccidentVisaEditBinding
|
import com.lukouguoji.gjj.databinding.ActivityIntImpAccidentVisaEditBinding
|
||||||
import com.lukouguoji.gjj.viewModel.IntImpAccidentVisaEditViewModel
|
import com.lukouguoji.gjj.viewModel.IntImpAccidentVisaEditViewModel
|
||||||
@@ -29,6 +30,10 @@ class IntImpAccidentVisaEditActivity :
|
|||||||
binding.fnoInput.et.setUpperCaseAlphanumericFilter()
|
binding.fnoInput.et.setUpperCaseAlphanumericFilter()
|
||||||
// 运单号:纯数字11位
|
// 运单号:纯数字11位
|
||||||
binding.wbNoInput.et.inputType = InputType.TYPE_CLASS_NUMBER
|
binding.wbNoInput.et.inputType = InputType.TYPE_CLASS_NUMBER
|
||||||
|
// 运单号满11位后自动查询舱单信息带出表单数据(覆盖手输、联想填充、弹窗选择)
|
||||||
|
binding.wbNoInput.et.doOnTextChanged { text, _, _, _ ->
|
||||||
|
viewModel.onWbNoChanged(text?.toString()?.trim() ?: "")
|
||||||
|
}
|
||||||
|
|
||||||
viewModel.rv = binding.rv
|
viewModel.rv = binding.rv
|
||||||
binding.rv.addOnItemClickListener(viewModel)
|
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_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
|
autoQueryEnabled="@{true}"
|
||||||
|
autoQueryMaxLength="@{8}"
|
||||||
|
autoQueryMinLength="@{8}"
|
||||||
|
autoQueryParamKey="@{`wbNo`}"
|
||||||
|
autoQueryTitle="@{`选择运单号`}"
|
||||||
|
autoQueryUrl="@{`/IntImpManifest/pageQueryWbNoList`}"
|
||||||
enable="@{!viewModel.isDetailMode}"
|
enable="@{!viewModel.isDetailMode}"
|
||||||
hint='@{"请输入运单号"}'
|
hint='@{"请输入运单号"}'
|
||||||
title='@{"运单号"}'
|
title='@{"运单号"}'
|
||||||
|
|||||||
Reference in New Issue
Block a user