feat: 完成进港查询与进港移库页面5.5寸手机端适配(设计稿11页全部完成)

进港查询(10,06出港查询的进港镜像):
- IntImpQueryActivity 手机布局:搜索行 + 三格统计(总票数/已入库/已出库客户端计数)
  + 状态标签卡片(dlvTime/inDate 前端推断)+ 筛选弹层9项(入参全部经api-doc核对存在)
- 详情页与运单追踪复用08/06已适配页零新增;平板侧滑筛选面板判空守卫,Pad端零变化
- 修复代理人空值兜底:转换器将JSON null归一为空串致DataBinding `??` 失效,
  改用Bean计算属性 agentDisplay(06出港查询同步修正)

进港移库(11,首个后端整模块缺失的设计稿页):
- 全新手机专属3页:列表(双Tab+角标/筛选4项/多选批量移库/卡片长按拍照浮层)
  + 运单详情(三卡片,Intent传bean零请求)+ 拍照上传(复用ImageSelectNewViewHolder,
  pic/originalPic/picNumber三字段规范)
- 后端无IntImpMove模块(api-doc核对),按IntExpMove同名约定预接四接口
  + 预定义权限串AppIntImpMove,后端交付后前端零改动生效(缺口#31)

其他:手机首页国际Tab新增进港查询/进港移库入口;新增资源bg_phone_btn_green/
bg_phone_card_header_orange/bg_phone_photo_add/phone_amber;问题清单登记#30~#31;
双端模拟器验证零崩溃(手机Map Local mock全交互链路,平板回归零变化)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 22:35:56 +08:00
parent b2a2cce585
commit a33776d959
37 changed files with 2884 additions and 476 deletions

View File

@@ -162,6 +162,13 @@ data class GjcMaWb(
/** 5.5寸手机版:空值统一占位 "--"(空串与 null 都兜底,布局绑定用) */
fun orDash(value: String?): String = if (value.isNullOrEmpty()) "--" else value
/**
* 5.5寸手机版:代理人展示值(名称优先,空则回退代码)。
* 不能在 XML 里用 `??` 兜底——转换器会把 JSON null 归一成空串,`??` 只判 null 不判空串。
*/
val agentDisplay: String?
get() = if (agentName.isNullOrEmpty()) agentCode else agentName
/**
* 5.5寸手机版-出港仓库:卡片状态标签(已清仓=绿 / 未清仓=橙clearNormal 为空视作未清仓)。
* 已清仓时卡片「清仓」按钮置灰不可点。

View File

@@ -0,0 +1,78 @@
package com.lukouguoji.module_base.bean
import androidx.databinding.ObservableBoolean
import com.lukouguoji.module_base.interfaces.ICheck
import java.io.Serializable
/**
* 国际进港移库 Bean5.5 寸手持端专属页面)
*
* ⚠️ 后端目前**没有**「国际进港移库」模块api-doc 仅有国内进港 DomImpMove 与国际出港 IntExpMove
* 2026-07-31 核对),字段按 IntExpMove 出参约定 + 设计稿展示需求镜像定义,
* 已登记《后端接口对接问题清单》。后端按同名约定交付后前端自动生效。
*/
data class IntImpMoveBean(
var no: String = "", // 运单号主体
var prefix: String = "", // 运单前缀
var wbNo: String = "", // 运单号
var pc: Long = 0, // 件数
var weight: Double = 0.0, // 重量
var fdate: String = "", // 航班日期
var fno: String = "", // 航班号
var flight: String = "", // 航班信息(日期/航班号 组合串)
var range: String = "", // 出运路径(如 HFE-NKG-LAX
var by1: String = "", // 承运人
var awbType: String = "", // 运单类型编码
var awbTypeName: String = "", // 运单类型名称
var businessType: String = "", // 业务类型编码
var businessName: String = "", // 业务类型名称
var moveState: Int = 0, // 移库状态0-待移库1-已移库)
var goods: String = "", // 品名(英文)
var goodsCn: String = "", // 品名(中文)
var agentName: String = "", // 代理人
var agentCode: String = "", // 代理代码
var spCode: String = "", // 特码
var maWbId: Long = 0, // 主单主键ID
var opId: String = "", // 移库人
var opdate: String = "", // 移库时间
var remark: String = "", // 备注
// 异常照片拍照上传三字段规范pic 缩略图 / originalPic 原图 / picNumber 数量)
var pic: String = "",
var originalPic: String = "",
var picNumber: String = "",
// UI扩展字段 - 使用ObservableBoolean实现自动UI更新
val checked: ObservableBoolean = ObservableBoolean(false),
// 卡片长按操作浮层显隐(仅 UI 状态)
val actionMenuVisible: ObservableBoolean = ObservableBoolean(false)
) : Serializable, ICheck {
override fun getCheckObservable(): ObservableBoolean = checked
var isSelected: Boolean
get() = checked.get()
set(value) = checked.set(value)
// ========== 5.5 寸手持端展示辅助字段(仅用于手机版布局,不参与序列化) ==========
/** 是否已移库moveState0-待移库1-已移库) */
val isMoved: Boolean
get() = moveState == 1
/** 品名:优先中文,为空回退英文 */
val goodsName: String
get() = goodsCn.ifEmpty { goods }
/** 航班信息展示:优先组合串,其次 日期/航班号 拼接 */
val flightInfo: String
get() = flight.ifEmpty {
if (fdate.isEmpty() && fno.isEmpty()) "" else "$fdate/$fno"
}
/** 详情页字段统一空值占位 */
fun orDash(value: String?): String = if (value.isNullOrEmpty()) "-" else value
}

View File

@@ -54,4 +54,26 @@ data class IntImpQueryBean(
// ==================== 其他 ====================
var remark: String? = null, // 备注
var activeId: Long? = null // 有效值
)
) {
/**
* 5.5寸手机版-进港查询:卡片状态标签。
* 已出库 = 出库时间dlvTime非空已入库 = 入库时间inDate非空都为空 = 未入库(灰)。
* 接口无独立状态出参,此判定为前端推断(与平板列表「入库时间/出库时间」两列同源)。
*/
val isQueryOutbound: Boolean
get() = !dlvTime.isNullOrEmpty()
val isQueryStored: Boolean
get() = !inDate.isNullOrEmpty()
/** 5.5寸手机版:空值统一占位 "--"(空串与 null 都兜底,布局绑定用) */
fun orDash(value: String?): String = if (value.isNullOrEmpty()) "--" else value
/**
* 5.5寸手机版:代理人展示值(名称优先,空则回退代码)。
* 不能在 XML 里用 `??` 兜底——转换器会把 JSON null 归一成空串,`??` 只判 null 不判空串。
*/
val agentDisplay: String?
get() = if (agentName.isNullOrEmpty()) agentCode else agentName
}

View File

@@ -272,6 +272,9 @@ interface Constant {
const val IntImpTally = "AppIntImpTally" //理货报告
const val IntImpPickUpRecord = "AppIntImpPickUpRecord" //提取记录
const val IntImpPickUpDLV = "AppIntImpPickUpDLV" //提取出库
// 进港移库后端暂无该模块与权限串2026-07-31 api-doc 核对),按 AppIntImp* 命名约定预定义,
// 权限串下发前手机首页菜单不会显示该入口(已登记后端接口对接问题清单)
const val IntImpMove = "AppIntImpMove" //进港移库
const val IntImpAccidentVisa = "AppIntImpAccidentVisa" //事故签证
const val GjjManifestListActivity = "AppIntExpManifest" //舱单
const val GjjTallyListActivity = "AppIntExpTally" //理货

View File

@@ -55,6 +55,7 @@ import com.lukouguoji.module_base.bean.GjAccidentVisaEditBean
import com.lukouguoji.module_base.bean.IntImpAccidentVisaBean
import com.lukouguoji.module_base.bean.IntImpPickUpDLVBean
import com.lukouguoji.module_base.bean.IntImpPickUpRecordBean
import com.lukouguoji.module_base.bean.IntImpMoveBean
import com.lukouguoji.module_base.bean.IntImpQueryBean
import com.lukouguoji.module_base.bean.GjjManifest
import com.lukouguoji.module_base.bean.GjjManifestBean
@@ -882,6 +883,38 @@ interface Api {
@POST("IntExpMove/move")
suspend fun submitIntExpMove(@Body data: RequestBody): BaseResultBean<SimpleResultBean>
/**
* 国际进港移库-分页查询
* 接口路径: /IntImpMove/pageQuery
* ⚠️ 后端暂无该模块2026-07-31 api-doc 核对),按 IntExpMove 命名约定预接,已登记问题清单
*/
@POST("IntImpMove/pageQuery")
suspend fun getIntImpMoveList(@Body data: RequestBody): BaseListBean<IntImpMoveBean>
/**
* 国际进港移库-分页合计
* 接口路径: /IntImpMove/pageQueryTotal
* ⚠️ 后端暂无该模块,同上
*/
@POST("IntImpMove/pageQueryTotal")
suspend fun getIntImpMoveTotal(@Body data: RequestBody): BaseResultBean<ManifestTotalDto>
/**
* 国际进港移库-批量移库
* 接口路径: /IntImpMove/move
* ⚠️ 后端暂无该模块,同上
*/
@POST("IntImpMove/move")
suspend fun submitIntImpMove(@Body data: RequestBody): BaseResultBean<SimpleResultBean>
/**
* 国际进港移库-异常照片上传pic/originalPic/picNumber 三字段规范)
* 接口路径: /IntImpMove/uploadPic
* ⚠️ 后端暂无该模块,同上
*/
@POST("IntImpMove/uploadPic")
suspend fun submitIntImpMovePic(@Body data: RequestBody): BaseResultBean<SimpleResultBean>
/**
* 国际出港库位操作-清仓
* 接口路径: /IntExpStorageUse/updateClear

View File

@@ -182,6 +182,7 @@ object ARouterConstants {
const val ACTIVITY_URL_INT_IMP_LOADING_LIST = "/gjj/IntImpLoadingListActivity" //国际进港 装机单(分拣理货)
const val ACTIVITY_URL_INT_IMP_TALLY = "/gjj/IntImpTallyActivity" //国际进港 理货报告
const val ACTIVITY_URL_INT_IMP_PICK_UP_DLV = "/gjj/IntImpPickUpDLVActivity" //国际进港 提取出库
const val ACTIVITY_URL_INT_IMP_MOVE = "/gjj/IntImpMoveActivity" //国际进港 进港移库5.5寸手机端专属页)
const val ACTIVITY_URL_INT_IMP_ACCIDENT_VISA = "/gjj/IntImpAccidentVisaActivity" //国际进港 事故签证
///////////////// 航班查询模块

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 手机版绿色操作按钮:完成态绿实底 + 10dp 圆角(进港移库-拍照上传「确认提交」) -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#0E9F6E" />
<corners android:radius="10dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="@color/phone_green" />
<corners android:radius="10dp" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 手机版详情卡片表头:橙色底 + 顶部 12dp 圆角(进港移库-异常照片卡片) -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/phone_amber" />
<corners
android:topLeftRadius="12dp"
android:topRightRadius="12dp" />
</shape>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 手机版照片加号槽位:灰色虚线边框 + 8dp 圆角(进港移库-异常照片) -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<corners android:radius="8dp" />
<stroke
android:width="1dp"
android:color="@color/phone_divider"
android:dashGap="4dp"
android:dashWidth="4dp" />
</shape>

View File

@@ -79,5 +79,6 @@
<color name="phone_tag_indigo_text">#6366F1</color>
<color name="phone_tag_amber_bg">#FEF3C7</color> <!-- 状态标签-琥珀底(出港运抵申报状态 E -->
<color name="phone_tag_amber_text">#D97706</color>
<color name="phone_amber">#F59E0B</color> <!-- 橙色信息卡表头(进港移库-异常照片) -->
</resources>