diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 2a2ef82..1002c71 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -35,7 +35,8 @@
"Bash(grep:*)",
"Bash(sort:*)",
"Bash(ls:*)",
- "Bash(xargs rm:*)"
+ "Bash(xargs rm:*)",
+ "Bash(git -C /Users/kid/Development/Fusion/Projects/aerologic-app stash)"
],
"deny": [],
"ask": []
diff --git a/CLAUDE.md b/CLAUDE.md
index 52cdf8c..dc66175 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -505,6 +505,69 @@ dataBean.value = bean
**类型**: `INPUT` / `SPINNER` / `DATE`
**注意**: 使用 PadDataLayout 时,`titleLength` 通常设置为 5
+#### PadDataLayoutNew - 输入完成回调
+
+**使用场景**: 当需要在用户完成输入(失去焦点)时触发自动查询或其他操作
+
+**正确用法**: 使用方法引用语法 `viewModel::methodName`
+
+```xml
+
+
+
+
+
+```
+
+**ViewModel 中的实现**:
+
+```kotlin
+/**
+ * 架子车号输入完成时调用
+ */
+fun onCarIdInputComplete() {
+ val id = carId.value
+ if (!id.isNullOrEmpty() && id != lastQueriedCarId) {
+ lastQueriedCarId = id
+ queryFlatcarInfo(id)
+ }
+}
+
+/**
+ * 航班日期选择完成时调用
+ */
+fun onFlightDateInputComplete() {
+ // 清除查询标记,以便重新查询
+ lastQueriedFlight = ""
+ queryFlightIfReady()
+}
+```
+
+**关键要点**:
+- ✅ **正确**: `setRefreshCallBack="@{viewModel::methodName}"` - 使用方法引用
+- ❌ **错误**: `setRefreshCallBack="@{() -> viewModel.methodName()}"` - Lambda 表达式会导致编译错误
+- 回调在输入框失去焦点时触发 (INPUT/SPINNER 类型)
+- 回调在日期选择完成后触发 (DATE 类型)
+- 适合实现输入完成后的自动查询功能
+
### 开发检查清单
#### ⚠️ 重要提醒
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 d897eb7..e5fe753 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
@@ -298,6 +298,12 @@ interface Api {
@POST("eqm/uld/queryUld")
suspend fun getUldDetails(@Query("id") id: String): BaseResultBean
+ /**
+ * 根据ULD编号查询ULD信息(新接口)
+ */
+ @GET("eqm/uld/queryUld")
+ suspend fun queryUldByCode(@Query("uld") uld: String): BaseResultBean
+
/**
* 获取运单信息 - 国际出
*/
@@ -1042,6 +1048,12 @@ interface Api {
@POST("flt/queryFlightById")
suspend fun getFlightDetails(@Query("id") id: String): BaseResultBean
+ /**
+ * 根据航班日期和航班号查询航班
+ */
+ @POST("flt/queryFlight")
+ suspend fun queryFlightByDateAndNo(@Body data: RequestBody): BaseResultBean
+
/**
* 获取航班目的站、经停站
*/
diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcBoxWeighingAddViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcBoxWeighingAddViewModel.kt
index a8bafbe..a65a9fc 100644
--- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcBoxWeighingAddViewModel.kt
+++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcBoxWeighingAddViewModel.kt
@@ -49,6 +49,12 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
val netWeight = MutableLiveData("0") // 装机重(蓝色)
val cargoWeight = MutableLiveData("0") // 货重(绿色)
+ // 需要自动查询的独立字段(用于监听输入变化)
+ val carId = MutableLiveData("") // 架子车号
+ val uldNo = MutableLiveData("") // ULD编号
+ val flightNo = MutableLiveData("") // 航班号
+ val flightDate = MutableLiveData("") // 航班日期
+
// 下拉选择数据源
val passagewayList = MutableLiveData>() // 通道号列表
val piCloseList = MutableLiveData>() // 探板收口列表
@@ -56,6 +62,11 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
// 打印挂签
val printTag = MutableLiveData(false)
+ // 标记位,避免重复查询
+ private var lastQueriedFlight = ""
+ private var lastQueriedCarId = ""
+ private var lastQueriedUld = ""
+
/**
* 初始化
*/
@@ -95,7 +106,84 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
loadPiCloseList()
// 初始化航班日期为今天
- dataBean.value?.fdate = Date().formatDate()
+ val today = Date().formatDate()
+ flightDate.value = today
+ dataBean.value?.fdate = today
+ }
+
+ /**
+ * 架子车号输入完成时调用
+ */
+ fun onCarIdInputComplete() {
+ val id = carId.value
+ if (!id.isNullOrEmpty() && id != lastQueriedCarId) {
+ lastQueriedCarId = id
+ queryFlatcarInfo(id)
+ }
+ }
+
+ /**
+ * ULD编号输入完成时调用
+ */
+ fun onUldNoInputComplete() {
+ val uld = uldNo.value
+ if (!uld.isNullOrEmpty() && uld != lastQueriedUld) {
+ lastQueriedUld = uld
+ queryUldInfo(uld)
+ }
+ }
+
+ /**
+ * 航班号输入完成时调用
+ */
+ fun onFlightNoInputComplete() {
+ queryFlightIfReady()
+ }
+
+ /**
+ * 航班日期输入完成时调用
+ */
+ fun onFlightDateInputComplete() {
+ // 清除查询标记,以便重新查询
+ lastQueriedFlight = ""
+ queryFlightIfReady()
+ }
+
+ /**
+ * 检查航班日期和航班号,如果都有值则查询航班信息
+ */
+ private fun queryFlightIfReady() {
+ val fdate = flightDate.value
+ val fno = flightNo.value
+ if (!fdate.isNullOrEmpty() && !fno.isNullOrEmpty()) {
+ val key = "$fdate-$fno"
+ if (key != lastQueriedFlight) {
+ lastQueriedFlight = key
+ queryFlightInfo(fdate, fno)
+ }
+ }
+ }
+
+ /**
+ * 查询航班信息,自动填充目的港
+ */
+ private fun queryFlightInfo(fdate: String, fno: String) {
+ val params = mapOf(
+ "fdate" to fdate,
+ "fno" to fno,
+ "countryType" to "1" // 国际航班
+ ).toRequestBody()
+
+ launchCollect({ NetApply.api.queryFlightByDateAndNo(params) }) {
+ onSuccess = { result ->
+ val flight = result.data
+ if (flight != null) {
+ dataBean.value = dataBean.value?.apply {
+ fdest = flight.fdest
+ }
+ }
+ }
+ }
}
/**
@@ -146,11 +234,16 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
* 航班日期点击
*/
fun flightDateClick(view: View) {
- Common.onYearMonthDay(view.context.getActivity(), dataBean.value?.fdate) { year, month, day ->
+ Common.onYearMonthDay(view.context.getActivity(), flightDate.value) { year, month, day ->
val calendar = Calendar.getInstance()
calendar.set(year, month - 1, day)
val date = calendar.time.formatDate()
+ // 清除查询标记,以便重新查询
+ lastQueriedFlight = ""
+ flightDate.value = date
dataBean.value = dataBean.value?.apply { fdate = date }
+ // 日期选择完成后立即触发查询
+ onFlightDateInputComplete()
}
}
@@ -172,8 +265,10 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
* 重置按钮点击
*/
fun resetClick() {
+ val today = Date().formatDate()
+
dataBean.value = GjcUldUseBean().apply {
- fdate = Date().formatDate()
+ fdate = today
}
diBangWeight.value = "0"
totalWeight.value = "0"
@@ -181,6 +276,17 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
cargoWeight.value = "0"
channel.value = ""
printTag.value = false
+
+ // 重置独立字段
+ carId.value = ""
+ uldNo.value = ""
+ flightNo.value = ""
+ flightDate.value = today
+
+ // 重置查询标记
+ lastQueriedFlight = ""
+ lastQueriedCarId = ""
+ lastQueriedUld = ""
}
/**
@@ -189,6 +295,12 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
fun confirmClick() {
val bean = dataBean.value ?: return
+ // 同步独立字段到 dataBean
+ bean.carId = carId.value ?: ""
+ bean.uld = uldNo.value ?: ""
+ bean.fno = flightNo.value ?: ""
+ bean.fdate = flightDate.value ?: ""
+
// 验证必填字段
if (bean.carId.verifyNullOrEmpty("请输入架子车号")) return
if (bean.uld.verifyNullOrEmpty("请输入ULD编号")) return
@@ -241,14 +353,18 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
val content = data.getStringExtra(Constant.Result.CODED_CONTENT).noNull()
when (requestCode) {
Constant.RequestCode.ULD -> {
+ // 更新独立字段
+ uldNo.value = content
dataBean.value = dataBean.value?.apply { uld = content }
- // 查询ULD信息,获取ULD自重
- queryUldInfo(content)
+ // 扫码完成后立即查询
+ onUldNoInputComplete()
}
Constant.RequestCode.CAR -> {
+ // 更新独立字段
+ carId.value = content
dataBean.value = dataBean.value?.apply { carId = content }
- // 查询架子车信息,获取架子车自重
- queryFlatcarInfo(content)
+ // 扫码完成后立即查询
+ onCarIdInputComplete()
}
}
}
@@ -258,7 +374,7 @@ class GjcBoxWeighingAddViewModel : BaseViewModel() {
* 查询ULD信息
*/
private fun queryUldInfo(uldNo: String) {
- launchCollect({ NetApply.api.getUldDetails(uldNo) }) {
+ launchCollect({ NetApply.api.queryUldByCode(uldNo) }) {
onSuccess = { result ->
val uldBean = result.data
if (uldBean != null) {
diff --git a/module_gjc/src/main/res/layout/activity_gjc_box_weighing_add.xml b/module_gjc/src/main/res/layout/activity_gjc_box_weighing_add.xml
index 48e5b45..1e6a099 100644
--- a/module_gjc/src/main/res/layout/activity_gjc_box_weighing_add.xml
+++ b/module_gjc/src/main/res/layout/activity_gjc_box_weighing_add.xml
@@ -57,11 +57,13 @@
android:orientation="horizontal">
@@ -88,11 +90,13 @@
android:orientation="horizontal">
@@ -302,20 +306,23 @@
android:orientation="horizontal">