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:
@@ -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 为空视作未清仓)。
|
||||
* 已清仓时卡片「清仓」按钮置灰不可点。
|
||||
|
||||
@@ -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
|
||||
|
||||
/**
|
||||
* 国际进港移库 Bean(5.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 寸手持端展示辅助字段(仅用于手机版布局,不参与序列化) ==========
|
||||
|
||||
/** 是否已移库(moveState:0-待移库,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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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" //理货
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" //国际进港 事故签证
|
||||
|
||||
///////////////// 航班查询模块
|
||||
|
||||
16
module_base/src/main/res/drawable/bg_phone_btn_green.xml
Normal file
16
module_base/src/main/res/drawable/bg_phone_btn_green.xml
Normal 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>
|
||||
@@ -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>
|
||||
12
module_base/src/main/res/drawable/bg_phone_photo_add.xml
Normal file
12
module_base/src/main/res/drawable/bg_phone_photo_add.xml
Normal 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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user