diff --git a/CLAUDE.md b/CLAUDE.md index 459b19f..a611653 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -146,6 +146,133 @@ class XxxViewModel : BasePageViewModel() { **参考文件**: `module_gjc/.../GjcBoxWeighingActivity.kt`、`GjcBoxWeighingViewModel.kt` +#### 列表项布局规范 (`item_xxx.xml`) + +**整体结构**: 水平 LinearLayout → 左侧图标 + 中间内容区(多行 KV)+ 右侧箭头 + +```xml + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**单个 KV 组件模板**: +```xml + + + + + + + +``` + +**关键对齐规则**: + +| 规则 | 说明 | 示例 | +|------|------|------| +| **列 weight 一致** | 第一行和第二行**相同位置**的 KV 组件必须使用相同的 `layout_weight` | 第一行第 1 列 `weight=1.0`,第二行第 1 列也必须 `weight=1.0` | +| **列 completeSpace 取最大值** | 同一列位置的 completeSpace 取两行中**较大**的那个值(1 个汉字 = 1 宽度,1 个标点 = 1 宽度) | 第一行"运单号:"=4,第二行"特码:"=3 → 两行都用 `completeSpace=4` | +| **右侧箭头统一** | 固定使用 `@drawable/img_pda_right`,尺寸 `30x30dp`,`layout_gravity="center"`,`marginLeft="10dp"` | — | + +**completeSpace 计算方法**: 统计 Label 字符数(含冒号),每个汉字算 1,每个标点(:)算 1。示例: +- "运单号:" = 3字 + 1标点 = 4 +- "运单类型:" = 4字 + 1标点 = 5 +- "状态:" = 2字 + 1标点 = 3 +- "始发站:" = 3字 + 1标点 = 4(注:此处"始发站:"虽然有4个字符位,但":"也要占1个宽度) + +同列两行的 completeSpace 统一取 `max(row1, row2)`。例如第 1 列:row1"运单号:"=4,row2"特码:"=3 → 两行都用 4。 + +**常用字段 weight 参考表**(基于国际出港模块统计): + +| 字段类型 | 典型 weight | 常见范围 | 典型 completeSpace | +|----------|------------|----------|-------------------| +| 运单号 | 1.0 | 0.9~1.2 | 4 | +| 件数 | 1.2 | 0.8~1.2 | 3~5 | +| 重量 | 0.8 | 0.7~1.0 | 3~5 | +| 状态 | 0.8 | 0.7~0.8 | 3~4 | +| 代理 | 0.8 | 0.7~0.8 | 3~4 | +| 特码 | 1.0 | 0.9~1.0 | 3~4 | +| 始发站/目的站 | 0.8 | 0.7~0.8 | 4 | +| 运单类型/业务类型 | 1.2 | 1.0~1.2 | 5 | +| 分单数 | 0.8 | 0.6~0.8 | 4 | +| 航班号/航班 | 1.0~1.2 | 1.0~1.2 | 4~5 | +| 时间类(入库/离港/过磅) | 1.0~1.2 | 1.0~1.2 | 5 | + +> **原则**: 相同字段在不同页面应使用相近的 weight,优先参照同模块已有布局。若新页面与已有页面**字段完全相同**,应直接复用其 weight 和 completeSpace 配置。 + +**典型 weight 分布示例**(5列,运单号/状态/代理/件数/重量 + 特码/始发站/目的站/运单类型/分单数): + +``` +位置: 第1列 第2列 第3列 第4列 第5列 +weight: 1.0 0.8 0.8 1.2 0.8 ← 第一行 +weight: 1.0 0.8 0.8 1.2 0.8 ← 第二行(必须相同) +cSpace: 4 4 4 5 4 ← 第一行 +cSpace: 4 4 4 5 4 ← 第二行(必须相同,取 max) +``` + +**参考文件**: `module_gjc/.../item_int_exp_tally.xml`(典型)、`item_gjc_query.xml`、`item_gjc_box_weighing.xml` + --- ### 类型 2:多选列表 + 批量操作页 diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt index 8d3f6bb..5eafa3b 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt @@ -7,7 +7,7 @@ import androidx.databinding.ObservableBoolean */ data class GjjAirManifest( // 主单原始舱单 - var maWbList: GjjImportManifest? = null, + var maWb: GjjImportManifest? = null, // 分单原始舱单列表 var haWbList: List? = null ) { @@ -24,6 +24,6 @@ data class GjjAirManifest( * 获取主单用于显示 */ fun getMainManifest(): GjjImportManifest { - return maWbList ?: GjjImportManifest() + return maWb ?: GjjImportManifest() } } 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 e22c05a..d6b1605 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 @@ -1727,7 +1727,7 @@ interface Api { * 国际进港原始舱单-分页查询 */ @POST("IntImpAirManifest/pageQuery") - suspend fun getIntArrAirManifestList(@Body data: RequestBody): BaseResultBean> + suspend fun getIntArrAirManifestList(@Body data: RequestBody): PageInfo /** * 国际进港原始舱单-分页合计 diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjManifestAddActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjManifestAddActivity.kt index 823794b..d485899 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjManifestAddActivity.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/GjjManifestAddActivity.kt @@ -55,5 +55,16 @@ class GjjManifestAddActivity : .putExtra(Constant.Key.BEAN, bean) context.startActivity(starter) } + + /** + * 编辑舱单(通过GjjImportManifest对象) + */ + @JvmStatic + fun startForEdit(context: Context, bean: com.lukouguoji.module_base.bean.GjjImportManifest) { + val starter = Intent(context, GjjManifestAddActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Modify.name) + .putExtra(Constant.Key.BEAN, bean) + context.startActivity(starter) + } } } \ No newline at end of file diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntArrAirManifestActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntArrAirManifestActivity.kt index 3e68903..859ba0d 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntArrAirManifestActivity.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntArrAirManifestActivity.kt @@ -45,8 +45,6 @@ class IntArrAirManifestActivity : viewModel.refresh() } - // 初始加载数据 - viewModel.refresh() } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/GjjManifestAddViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/GjjManifestAddViewModel.kt index 84fcb0e..d777dda 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/GjjManifestAddViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/GjjManifestAddViewModel.kt @@ -146,9 +146,11 @@ class GjjManifestAddViewModel : BaseViewModel() { // 编辑模式:从Bean对象加载数据 if (pageType.value == DetailsPageType.Modify) { - val bean = intent.getSerializableExtra(Constant.Key.BEAN) as? com.lukouguoji.module_base.bean.GjjManifest - if (bean != null) { + val bean = intent.getSerializableExtra(Constant.Key.BEAN) + if (bean is com.lukouguoji.module_base.bean.GjjManifest) { loadManifestFromBean(bean) + } else if (bean is com.lukouguoji.module_base.bean.GjjImportManifest) { + loadManifestFromImportBean(bean) } } } @@ -183,6 +185,30 @@ class GjjManifestAddViewModel : BaseViewModel() { waybillType.value = manifest.awbType } + /** + * 从GjjImportManifest对象加载数据(编辑模式) + */ + private fun loadManifestFromImportBean(manifest: com.lukouguoji.module_base.bean.GjjImportManifest) { + fid = manifest.fid.toString() + + // 填充表单字段 + waybillNo.value = manifest.wbNo + waybillNum.value = manifest.totalPc.toString() + actualNum.value = manifest.pc.toString() + actualWeight.value = manifest.weight.toString() + departure.value = manifest.origin + destination.value = manifest.dest + goodsNameCn.value = manifest.goodsCn + goodsNameEn.value = manifest.goods + unNumber.value = manifest.unNumber + remark.value = manifest.remark + + // 设置下拉框选中值 + agent.value = manifest.agentCode + specialCode.value = manifest.spCode + waybillType.value = manifest.awbType + } + /** * 保存点击 */ diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt index 04e8fd8..368185b 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt @@ -106,7 +106,7 @@ class IntArrAirManifestViewModel : BasePageViewModel() { val haWbList = mutableListOf() selectedItems.forEach { airManifest -> - airManifest.maWbList?.let { maWbList.add(it) } + airManifest.maWb?.let { maWbList.add(it) } airManifest.haWbList?.let { haWbList.addAll(it) } } @@ -141,7 +141,7 @@ class IntArrAirManifestViewModel : BasePageViewModel() { } // 获取第一个选中项的主单数据 - val manifest = selectedItems.firstOrNull()?.maWbList ?: return + val manifest = selectedItems.firstOrNull()?.maWb ?: return // 跳转到补充信息页面 com.lukouguoji.gjj.activity.IntArrSupplementInfoActivity.start( @@ -175,7 +175,7 @@ class IntArrAirManifestViewModel : BasePageViewModel() { val haWbList = mutableListOf() selectedItems.forEach { airManifest -> - airManifest.maWbList?.let { maWbList.add(it) } + airManifest.maWb?.let { maWbList.add(it) } airManifest.haWbList?.let { haWbList.addAll(it) } } @@ -223,7 +223,7 @@ class IntArrAirManifestViewModel : BasePageViewModel() { val haWbList = mutableListOf() selectedItems.forEach { airManifest -> - airManifest.maWbList?.let { maWbList.add(it) } + airManifest.maWb?.let { maWbList.add(it) } airManifest.haWbList?.let { haWbList.addAll(it) } } @@ -264,10 +264,10 @@ class IntArrAirManifestViewModel : BasePageViewModel() { // 统计参数(无分页) val totalParams = filterParams.toRequestBody() - // 获取列表(带Loading) + // 获取列表(带Loading,接口直接返回PageInfo,无BaseResultBean包装) launchLoadingCollect({ NetApply.api.getIntArrAirManifestList(listParams) }) { onSuccess = { result -> - pageModel.handleListBean(result.data?.toBaseListBean()) + pageModel.handleListBean(result.toBaseListBean()) } } @@ -290,7 +290,7 @@ class IntArrAirManifestViewModel : BasePageViewModel() { val airManifest = list.getOrNull(position) ?: return // 获取主单数据 - val manifest = airManifest.maWbList ?: return + val manifest = airManifest.maWb ?: return // 跳转到详情页 com.lukouguoji.gjj.activity.IntArrAirManifestDetailsActivity.start( diff --git a/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml b/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml index 113309a..7cc5465 100644 --- a/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml +++ b/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml @@ -19,14 +19,15 @@ type="Integer" /> - + android:padding="10dp"> - + android:layout_height="wrap_content"> - + android:layout_weight="1.0" + android:gravity="center_vertical"> + completeSpace="@{4}" + android:text="运单号:" /> - + - + android:gravity="center_vertical"> + completeSpace="@{4}" + android:text="状态:" /> + android:text="@{manifest.mftStatus ?? ``}" /> - + - + android:gravity="center_vertical"> + completeSpace="@{4}" + android:text="代理:" /> + android:text="@{manifest.agentCode ?? ``}" /> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_weight="1.2" + android:gravity="center_vertical"> + android:text="件数:" /> + android:text="@{String.valueOf((int)manifest.pc)}" /> - + - - + + android:layout_weight="0.8" + android:gravity="center_vertical"> + android:text="重量:" /> + android:text="@{String.valueOf((int)manifest.weight)}" /> - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + android:layout_gravity="center" + android:layout_marginLeft="10dp" + android:src="@drawable/img_pda_right" /> - +