# 版本变更日志 (Changelog)

本文档记录 AirLogistics 项目的所有重要变更。

格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。

## [Unreleased]

### 变更 (Changed)
- 【进港移库归属更正 · 2026-08-03】设计稿 11「进港移库」经确认归属**国内进港移库
  （DomImpMove，后端 8 接口齐全，Pad 首页「国内进港→进港移库」既有页面）**，此前误判为
  国际进港并按 IntExpMove 约定预接不存在的 IntImpMove 模块（原问题清单 #31 作废）。处置：
  ① 删除 module_gjj 的 IntImpMove 全套前端实现（3 Activity + 3 ViewModel + Holder + 4 布局 +
  `IntImpMoveBean` + Api 4 方法 + 国际 Tab 菜单项 + 权限串/路由/双 Manifest 注册）；
  ② 按 phone-adapt 流程重新适配到 `GnjMoveStashListActivity`（app 模块）：主列表双形态
  （Pad 布局移 layout-sw600dp 零改动；手机版 = PhoneSearchBar + 待移库/已移库 Tab
  （`DomImpMove/search`/`searchMoved` 双端点，`searchMoved` 无移库标识按端点打 `isMoved`）+
  角标（双端点 limit=1 取 total，仅手机发起）+ 筛选弹层 4 项 + 全选/已选计数 + 批量移库
  （复用平板 `move` 链路）+ 卡片长按「拍照」浮层）；新增手机专属页
  `GnjMoveStashDetailActivity`（Intent 传 bean 零请求，三卡片）与
  `GnjMoveStashPhotoActivity`（先调 `detail` 回填已有照片，提交走 `modify` 最小体
  三字段规范，与平板移交编辑页同链路）；`MoveStashBean` 增 `agentName`/`isMoved`/
  `actionMenuVisible`/`agentDisplay`/`orDash`；手机首页入口改挂**国内 Tab**（`GnViewModel`
  补通用 route 跳转，权限串 `GnjYiKu=AppDomImpMove` 与 Pad 一致，新路由
  `/app/GnjMoveStashListActivity`）。
  2026-08-03 内网真实数据双端验证通过（登录→国内 Tab→列表/Tab/详情/筛选/全选/长按拍照全链路
  crash=0；平板回归原行为零变化）；Proxyman A/B：`wbNo`/`awbType` 过滤生效，
  `fdate`/`fno`/`spCode` 被后端静默忽略（新缺口 #32）、`searchMoved`/`detail` 出参
  `opId`/`opDate` 恒 null 且无姓名字段（#33）、`searchMoved` 无 pic 三字段（#34，前端已规避）

### 新增 (Added)
- 「进港查询」5.5 寸手机端适配（设计稿 10_进港查询，06 出港查询的进港镜像；详情页与运单追踪
  复用 08/06 已适配页零新增）：列表 `IntImpQueryActivity`（module_gjj，首页菜单实际跳转页；
  旧版 `GjjQueryListActivity` 路由已注释弃用）手机布局 = PhoneSearchBar（运单号+扫码+筛选）+
  三格统计（总票数/已入库/已出库，已入库/已出库为已加载数据客户端计数，`pageQueryTotal` 无分项
  出参，缺口 #30）+ 状态标签卡片（前端推断：`dlvTime` 非空=已出库绿 / `inDate` 非空=已入库橙 /
  兜底未入库灰）+ 卡片字段件数(inPc)/重量(inWeight)/代理人/特码；筛选弹层 9 项
  （航班日期起止/航班号/代理/特码/始发站/运单类型/业务类型/品名中，**全部经 api-doc 核对为
  pageQuery 真实入参**，无缺口）；平板侧滑筛选面板代码判空守卫，Pad 端行为零变化
- 「进港移库」5.5 寸手机端全新页面（设计稿 11_进港移库；**首个后端整模块缺失的适配页**：
  api-doc 确认无 IntImpMove 模块、权限体系无对应 key，缺口 #31）：
  `IntImpMoveActivity`（待移库/已移库 Tab + 角标、搜索/扫码、筛选弹层 4 项（航班日期/航班号/
  特码/运单类型）、多选 + 全选 + 批量移库（ConfirmDialogModel 确认）、卡片长按浮层「拍照」）+
  `IntImpMoveDetailActivity`（运单详情三卡片：蓝头基本信息/绿头移库信息(仅已移库)/橙头异常照片，
  Intent 传 bean 零请求）+ `IntImpMovePhotoActivity`（拍照上传：图片网格复用 module_base
  `ImageSelectNewViewHolder`，提交走 pic/originalPic/picNumber 三字段规范）；
  接口按 IntExpMove 同名约定预接四个（pageQuery/pageQueryTotal/move/uploadPic），权限串
  `AppIntImpMove` 预定义，后端交付后前端零改动生效（权限串下发前手机首页无入口，debug 直启验证）
- 新增 `IntImpMoveBean`（镜像 GjcMove + 航班/照片字段 + isMoved/flightInfo/orDash 计算属性）；
  `IntImpQueryBean` 新增 isQueryOutbound/isQueryStored/orDash/agentDisplay 计算属性；
  手机首页「国际」Tab 增加「进港查询」（图标 gjj_query_icon）与「进港移库」（图标复用
  gjc_yi_ku_icon）入口
- 新增手机版资源：`bg_phone_btn_green`（绿色主按钮）、`bg_phone_card_header_orange`（橙色详情卡
  表头）、`bg_phone_photo_add`（虚线加号槽位）、色值 `phone_amber`

### 修复 (Fixed)
- 【11 模块全量设计稿走查】修正 4 类差异（2026-07-31，3 个并行审计 + 逐态渲染比对）：
  ① 运单追踪手机竖排时间线补齐已发生节点的状态 pill（绿底标签展示该环节日志 content，
  如「放行状态：01」，超长省略，设计稿 06/08 运单追踪均有此元素）；
  ② 11 个页面手机端标题对齐设计稿短标题（出库交接/出港待计重/计重记录/计重明细/开始计重/
  出港运抵/出港移库/出港查询/出港货物/进港查询/进港货物），平板保持原长标题零变化；
  ③ ULD 编辑表单「来源」字段移至「所在港」之后（设计稿顺序）；
  ④ 出港计重列表卡片（日期/航程/代理/特码）与计重记录卡片（代理）补齐字段小图标
  （复用 ic_phone_airplane/location/person/tag，与其余模块卡片风格统一）
- 出港查询/进港查询卡片「代理人」空值兜底失效：转换器把 JSON null 归一成空串，DataBinding
  `??` 只判 null 不判空串导致 agentCode 回退永不生效；改用 Bean 计算属性 `agentDisplay`
  （isNullOrEmpty 双兜底），已同步修正 06 出港查询（`item_gjc_query.xml`）

### 验证 (Verified)
- 进港查询手机端：Map Local mock 验证三格统计计数、三种状态标签、空值 "--" 兜底、筛选弹层
  9 项收缩滚动；平板端回归横排搜索条/侧滑筛选面板/底部统计栏零变化；全程崩溃数 0
- 进港移库手机端：Map Local mock 验证双 Tab 角标、双形态卡片、单选/全选联动计数、空选拦截、
  移库确认弹框、长按拍照浮层、运单详情、拍照上传页；全程崩溃数 0（后端模块缺失，接口联调待
  后端交付，见问题清单 #31）
- 「提取出库」5.5 寸手机端适配（设计稿 09_提取出库）：列表 `IntImpPickUpDLVActivity`（module_gjj）
  手机布局 = PhoneSearchBar（运单号+扫码+筛选）+ **PhoneStatusTab 待出库/已出库**（`outState`
  为 pageQuery 文档定义入参 0/1，Tab 真实过滤 + 角标双 pageQueryTotal，抓包证实携带）+
  双形态卡片（待出库：圆形勾选框+橙标签+库位行；已出库：绿 √ 标签+出库人·出库时间行，
  `isPickedUp` = dlvTime 非空）+ 卡片内 PhoneStatBox 三列（代理人/件数/重量）+「查看详情」链接 +
  PhoneBottomBar（全选+已选 N 项+出库，仅待出库 Tab 显示，复用既有 confirmOutbound）；
  筛选弹层 4 项（航班日期为 pageQuery 未定义入参预留；航班号 fno；代理人/特码下拉）；
  手机端进入时清空平板默认「当天缴费日期」查全量（initPhoneExtras，平板默认值不变）
- 手机专属新页「运单详情」`IntImpPickUpDetailActivity`：蓝头运单卡（红标签国际进港+品名大标题+
  两列 KV+库位橙标签）+ 绿头提货信息卡（柜台办理人/时间，已出库追加出库人/出库时间行），
  数据直接 Intent 传列表 bean（Serializable），零新增请求
- `IntImpPickUpDLVBean` 新增 `isPickedUp` 计算属性；手机首页「国际」Tab 增加「提取出库」入口
  （权限 AppIntImpPickUpDLV 对应权限串，图标复用 Pad 端 gjj_chu_ku_icon）
- 后端缺口 2 项登记问题清单 #28~#29（pageQuery 无 fdate 入参、出参无车牌/目的港/业务类型；
  outState 过滤与 dlvName=出库人语义待内网实测）

- 「进港仓库」5.5 寸手机端适配（设计稿 08_进港仓库，07 出港仓库的进港镜像 + 进港详情页首次适配）：
  列表 `IntImpStorageUseActivity`（module_gjj，首页菜单实际跳转页；旧版 `GjjWareHouseActivity`
  路由已注释弃用）手机布局 = PhoneSearchBar（placeholder「搜索运单号/航班号」，`phoneSearchClick`
  分流：含字母→fno、其余→wbNo，实机抓包证实）+ 三格统计（总票数/未清仓/已清仓，clearNormal=0/1
  双 total）+ 卡片四操作按钮（清仓/修改库位/出库/入库，已清仓置灰）+ 卡片字段件数/重量/航班号/
  **始发站**（bean.dep，出港为目的站）；筛选弹层 8 项（始发站走 fdep 入参；代理/特码/运单类型/
  业务类型/品名中 5 项为后端未定义入参，预留传参）
- 进港详情页 `IntImpQueryDetailsActivity` + 3 Fragment（运单/仓库/库位信息）首次手机适配：
  移植 06 出港详情手机布局，报文区按设计稿 3 项（原始舱单 mftStatus/理货报告 tallyStatus/
  海关放行 command），件重区直取 detail 出参 awbPc/awbWeight/cashWeight/inPc/inWeight
  （进港自带无需求和），库位卡片优先显示中文姓名（inOpName/outOpName）；
  ViewModel 增加 str/strOr/dec 取值帮助（与出港同口径）
- 进港版 3 个操作弹框双变体化（清仓/入库/修改库位，手机底部弹层）；修改库位手机版增加
  「原库位」单选且**只列未出库库位**（沿用平板「已出库不允许修改」校验，卡片级操作时全部已出库
  toast 拦截），单库位默认选中
- 手机首页「国际」Tab 增加「进港仓库」入口（权限 AppGjjWareHouse=Constant.AuthName.GjjWareHouseActivity 对应权限串，图标复用出港仓库同款）
- 后端缺口 3 项登记问题清单 #25~#27（pageQuery 无代理/特码/运单类型/业务类型/品名中 5 项筛选
  入参；clearNormal 分项统计待实测；detail 出参 dep/dest1/dest/unNumber/opDate 字段待实测确认）
- 「出港仓库」5.5 寸手机端适配（设计稿 07_出港仓库，详情/运单追踪复用已适配页零新增）：
  列表 `IntExpStorageUseActivity` 手机布局 = PhoneSearchBar（运单号 + 扫码 + 筛选）+ 三格统计
  （总票数/未清仓/已清仓，彩色左边条卡片；分项计数按同条件 + `clearNormal=0/1` 各调一次
  `pageQueryTotal`，仅手机形态发起）+ 状态标签卡片（已清仓绿/未清仓橙，`clearNormal=="1"` 判定）；
  **卡片级四操作按钮**（清仓/修改库位/出库/入库，已清仓时清仓置灰拦截）取代平板的勾选+底部批量条，
  语义等价于「勾选该主单+全部库位」复用既有 `performClear/performModifyStorage/performOutStorage/
  performInStorage` 请求链路；卡片点击进详情（复用出港查询详情 `GjcQueryDetailsActivity` 3 Tab
  运单/仓库/库位信息，运单追踪同样复用 `LogDetailActivity`）；筛选弹层 8 项按设计稿完整实现
  （航班日期/航班号/代理/特码/目的站/运单类型/业务类型/品名中，后三项为后端未定义入参，预留传参）
- 清仓/入库/修改库位三个操作弹框（`IntExpMoveClearDialogModel`/`IntExpInStorageDialogModel`/
  `IntExpModifyStorageDialogModel`）双变体化：手机底部弹层（PhoneDataLayout）+ 平板居中弹框不变，
  弹出位置按 `DeviceUtil.isPhone()` 切换；修改库位弹框手机版新增「原库位」单选
  （卡片级操作时运单可能有多个库位，构造参数 `sourceStorageList` 传入，单库位默认选中，平板路径不受影响）
- 出库二次确认由系统 `AlertDialog` 改为项目规范的 `ConfirmDialogModel`（平板批量出库与手机卡片出库共用）
- 手机首页「国际」Tab 增加「出港仓库」入口（权限 AppIntExpStorageUse，图标复用 Pad 端 gjc_cang_ku_icon）
- `GjcMaWb` 新增 `isCleared` 手机版计算属性；新增手机版资源 `bg_phone_btn_disabled`（灰底禁用按钮）
- 后端缺口 2 项登记问题清单 #23~#24（pageQuery/pageQueryTotal 无 awbType/businessType/goodsCn
  筛选入参；pageQueryTotal 的 clearNormal 分项统计过滤待内网 A/B 实测确认）
- 「出港查询」5.5 寸手机端适配（设计稿 06_出港查询，含列表/详情/运单追踪三页）：
  列表 `GjcQueryActivity` 手机布局 = PhoneSearchBar（运单号 + 扫码 + 筛选）+ 三格统计
  （总票数/已入库/已离港，彩色左边条卡片）+ 状态标签卡片（已离港绿/已入库橙/未入库灰，
  前端推断口径：fclose 非空=已离港，否则 opDate 非空=已入库）；筛选弹层 9 项（平板搜索行的
  日期起止/代理并入弹层，特码按设计稿改下拉，字典 `getSpecialCodeList(flag=1, ieFlag="")`，
  仅手机形态经 `initPhoneExtras()` 加载）；详情 `GjcQueryDetailsActivity` 3 Tab 全部复用
  ViewPager2 + Fragment，手机变体以 PhoneKvItem 网格呈现「基本信息/件重信息/回执信息」，
  比平板多展示承运人/始发站/中转站/目的站/UN编号，入库件数/入库重量 = warehouseList 各批次求和；
  仓库/库位 Tab 改批次/库位卡片；「运单追踪」为公共页 `LogDetailActivity` 双变体首例——
  手机竖排流转时间线（Activity `buildVerticalSteps` 动态构建，节点绿=已达/灰=未达 + 环节时间），
  平板横向步骤条零改动，手机标题按形态显示「运单追踪」
- 手机首页「国际」Tab 增加「出港查询」入口（权限 AppIntExpSearch，图标复用 Pad 端 gjc_query_icon）
- `PhoneKvItem` 新增 `tagColor` 属性（"green" 绿色高亮，海关放行正常态；默认 "orange"），
  且占位符 "-"/"--" 不再套高亮标签底
- `GjcMaWb` 新增 `isQueryDeparted`/`isQueryStored`/`orDash` 手机版计算属性
- 新增手机版资源：`ic_phone_package`（件数）、`ic_phone_tag`（特码）、`bg_phone_dot_blue/gray`
- 后端缺口 2 项登记问题清单 #21~#22（isFclose 入参实测被 pageQuery/pageQueryTotal 静默忽略且
  无已入库/已离港分项统计出参；detail 出参无锁定状态/计费重量字段）

### 修复 (Fixed)
- 提取出库手机版底部条「已选 N 项」在点全选后不更新：`checkAllClick` 只改勾选状态未同步
  `selectedCountText`（卡片单选走 FlowBus→updateCheckAllStatus 正常），补同步后实测「已选 3 项」正确
- **`PhoneFilterPanel` 底部按钮被挤出屏幕**：面板高度 wrap_content 且内容插槽无滚动，筛选项多
  （出港查询 9 项）时「重置/确认」按钮直接超出屏幕外且无任何报错。修复：内容插槽外包
  ScrollView（weight=1），筛选项少时行为不变，超屏时内容区收缩滚动、按钮始终可见
  （已回归出港计重 4 项弹层，行为不变）

### 验证 (Verified)
- 提取出库双端验证通过（2026-07-31，Proxyman Map Local mock 口径）：手机端菜单入口、
  Tab 角标（双 total）、双形态卡片（含库位空值兜底）、单选/全选与「已选 N 项」联动、
  出库 ConfirmDialogModel、待出库/已出库两种详情页形态（出库人行按需显隐）、筛选弹层 4 项、
  Tab 切换请求体抓包证实 outState=1 正确携带、冷启动方向恒竖屏、崩溃 0；
  平板端回归：缴费日期默认当天/5 搜索条/全选/底部统计/确认出库与改造前一致，崩溃 0。
  **待内网补测**：outState 过滤 A/B、dlvName=出库人语义、出库真实提交链路
- 进港仓库双端验证通过（2026-07-31，同出港仓库为 Proxyman Map Local mock 口径）：
  手机端登录→国际 Tab→进港仓库菜单入口、三格统计、三种卡片形态（含空值 "--" 兜底）、
  详情 3 Tab 全字段（锁定状态转中文、库位中文姓名、时间截断、空值兜底）、四操作弹框、
  已出库库位过滤（双库位卡片原库位仅列未出库项并默认选中）、无库位/已清仓拦截、
  筛选弹层 8 项、搜索分流实机抓包证实（输入 MU1111 → 请求体 fno="MU1111"、wbNo=null）、
  冷启动方向恒竖屏、崩溃 0；平板端回归：5 搜索条/全选/底部统计/4 批量按钮与改造前一致，崩溃 0。
  **待内网补测**：clearNormal 分项统计 A/B、detail 推断字段（dep/dest1/dest/unNumber/opDate）、
  四操作真实提交链路
- 出港仓库双端验证通过（2026-07-31，开发机不在内网 → 全程 Proxyman Map Local mock 口径）：
  手机端登录→国际 Tab→出港仓库菜单入口、三格统计渲染、三种卡片形态（已清仓置灰清仓/未清仓/
  全空字段 "--" 兜底）、四操作按钮（清仓/入库底部弹层、修改库位弹层含原库位默认选中、
  出库 ConfirmDialogModel 文案带运单号与库位数、无库位卡片 toast 拦截、已清仓清仓点击拦截）、
  筛选弹层 8 项滚动 + 底部按钮可见、卡片点击进详情（Proxyman flow 证实 maWbId 正确传参且
  detail mock 命中）、详情右上运单追踪跳转、冷启动方向恒竖屏（ROTATION_0×3 采样）、崩溃 0；
  平板端同页面回归：5 搜索条/全选/底部统计/4 批量按钮与改造前一致，崩溃 0。
  **待内网补测**：clearNormal 分项统计 A/B、agentCode/spCode/dest 筛选实测、四操作真实提交链路
- 出港查询双端实机验证通过（2026-07-31，内网真实数据 2026-06-09 共 14 票）：
  手机端登录→国际 Tab→出港查询菜单入口、列表加载/状态标签/三格统计（10+4=14 与卡片一致）、
  筛选弹层（日期滚轮、特码/代理下拉真实取数、重置、确认后重新查询）、运单号搜索、扫码拉起、
  详情 3 Tab（含仓库批次卡与库位空态）、运单追踪时间线、冷启动方向恒竖屏（mRotation=0×8 采样）、
  全程 FATAL 0；平板端回归：列表 5 搜索条 + 底部统计 + 侧滑筛选面板 + 详情表格样式均与改造前一致
- 「出港运抵」5.5 寸手机端适配（主列表 + 3 个手机专属新页，设计稿 04_出港运抵）：
  主列表 `IntExpArriveActivity` 新增「待运抵/已运抵」Tab（客户端按 declareStatus 是否为空拆分数据集，
  接口无此查询参数）+ 卡片长按浮层（待运抵→补充、已运抵→重置+回执，纯 UI 长按）+ 底部全选/已选/申报
  （仅待运抵 Tab 显示，选中范围独立于 Pad 全量选择逻辑）；新增「分单明细」`IntExpArriveSubOrderActivity`
  （数据直接复用主列表已加载的 haWbList，零新增请求，长按单条重置 + 底部批量申报）；新增「回执内容」
  `IntExpArriveReceiptActivity`（只读页，复用 haWbList[].response + arrivalOpDate）；新增「补充信息」
  `IntExpArriveSupplementActivity`（参照 Pad 端国际进港「收发货人信息」批量应用模式，对整个运单的
  haWbList 批量应用同一份表单，后端接口不存在，已实机确认 404，见问题清单 #19）
- 手机首页「国际」Tab 增加「出港运抵」入口
- `GjcMaWb`/`GjcHaWb` 新增 `isPending`/`declareTagColor`/`haWbTagColor`/`arrivalOpDateText` 等
  手机版专属计算属性；`GjcHaWb` 补充 `Serializable` 实现（供 Intent 跨页传递分单列表）
- 新增手机版资源：`bg_phone_tag_indigo`/`bg_phone_tag_amber`（申报状态三色标签）、
  `bg_phone_fab_purple`/`bg_phone_fab_amber`/`bg_phone_fab_green`（长按浮层圆形操作按钮）
- 后端缺口 2 项登记问题清单 #19~#20（分单补充信息保存接口不存在、Tab 无申报状态查询参数）
- 「出港运抵」对照设计稿 review 修正：状态重置弹框手机端改为设计稿底部弹层
  （**弹框适配首个先例**：`dialog_int_exp_arrive_reset.xml` 同名布局双变体，Pad 版移至
  `layout-sw600dp/`，`IntExpArriveResetDialogModel` 构造参数按 `DeviceUtil.isPhone()` 切
  `DIALOG_TYPE_BOTTOM`/`CENTER`）；主列表补空态（图标 + 文案按 Tab 切换「暂无待/已运抵的运单」）；
  回执页补空态兜底「暂无回执内容」（单分单入口常无回执，避免纯白屏）；分单明细长按浮层按设计稿
  补「回执」按钮（单分单跳回执页）；分单页底部统计加分母「已选 N / M 项」；Tab 角标初始显示 0

### 修复 (Fixed)
- **RecyclerView + Tab 过滤新坑**：给 item 根节点加 `visibility="@{...}"` 切 Tab 会在列表里
  留下空白——RecyclerView/LinearLayoutManager 不像普通 ViewGroup 那样让 GONE 子项自动塌陷为
  0 高度。改为在 ViewModel 数据层维护完整列表，Tab 切换时把过滤后的子集整体 `refresh()` 给
  adapter（已实机截图验证空白消失、卡片数与角标一致）
- **Serializable Intent + @Transient 崩溃新坑**：`GjcMaWb`/`GjcHaWb` 的 `checked` 等 UI 状态
  字段标了 `@Transient`（避免 Gson 序列化 ObservableBoolean），但这同时是 JVM `transient`
  修饰符，Java 序列化（Intent 传递机制）会跳过其恢复，反序列化后为 null，切换选中状态时
  NullPointerException 崩溃。修复：接收方 `initOnCreated` 对列表 `.map { it.copy() }` 重新
  触发类体初始化补上（已实机崩溃复现并验证修复）
- `PhoneStatusTab`/`PhoneFilterPanel` 补上遗漏的 `dispatchSaveInstanceState`/
  `dispatchRestoreInstanceState` 屏蔽覆写（其余 5 个手机版复合组件均已重写，这两个是历史遗漏；
  同页多实例时子控件状态可能按 id 跨实例串档）

### 验证 (Verified)
- 出港运抵双端实机验证通过：手机端 Tab 切换（角标/卡片双向正确）/全选/单选/长按菜单/查看分单
  /分单明细全选与长按重置/补充信息（真实数据回填+下拉字典+提交请求体完整+后端404如实呈现）/
  回执页 全链路 crash=0、方向无闪屏；平板端布局与交互（4 搜索条+分单内嵌展开+底部 5 元素操作栏）
  与改造前逐项一致
- 出港运抵 review 修正双端实机验证通过：手机端重置底部弹层（长按→重置→下拉展开选项）/主列表空态
  /回执页空态/分单浮层重置+回执双按钮/「已选 0 / 2 项」分母 全部与设计稿一致且 crash=0；
  平板端回归：列表、批量「状态重置」弹框仍为居中 Pad 样式，行为与改造前一致
- 「出港计重」5.5 寸手机端适配（首个全链路 4+1 页模块，设计稿 03_出港计重）：
  待计重列表（三格统计 总票数/待计重/计重中 + 卡片状态标签 未计重/计重中 + 卡片内单票「提前运抵」+
  FAB 进计重记录 + 筛选弹层 通道号/承运人/运单类型/代理人）、开始计重（头部预配统计卡 + PhoneFormRow 表单，
  托盘数量/托盘自重按设计稿手输）、计重记录（三格统计 + 卡片地磅图标进明细/「查看详情」进运单详情 +
  筛选弹层 入库日期起止/代理人/特码/目的站/计重人）、计重明细（汇总卡含托盘总重 + 记录卡「修改」→
  全屏「修改记录」覆层，复用平板 isEditMode 编辑链路，保存后留在本页）、手机专属新页「运单详情」
  `GjcWeighingWbDetailActivity`（12 字段只读网格）；手机首页「国际」Tab 增「出港计重」入口
- 新增手机版公共资源：`bg_phone_btn_weak`（浅蓝弱按钮）、`bg_phone_card_top_accent`（卡片顶部主色描边条）、
  `ic_phone_clipboard`、`ic_phone_weight`
- `GjcMaWb` 预留 `palletNumber`/`carWeight` 字段、`GjcCheckInRecord` 增 `carWeightStr` 双向绑定属性
  （均为手机版专属，平板请求体零变化）；后端缺口 7 项登记问题清单 #12~#18
  （checkIn 过滤不生效、主列表筛选三入参、入库日期范围、通道号出参、计重人姓名、arriveFlag 不回填、
  托盘数量/自重入参）

### 修复 (Fixed)
- 出港计重手机版搜索分流按实测修正：`likeNo` 并非任意模糊（按 8 位 no 匹配），
  11 位全号改走 `wbNo` 精确查询，含字母走 `fno`

### 验证 (Verified)
- 出港计重双端实机验证通过：手机端 待计重列表/筛选/开始计重（必填校验）/计重记录/记录筛选/运单详情/
  计重明细/修改覆层保存/单票提前运抵 全链路 crash=0、方向无闪屏、请求体新参数全部正确携带；
  平板端 待计重/计重记录/开始计重 三页回归无变化（横屏、5 搜索条、日期默认今天、地磅区/托盘车号/浮动按钮组均在）
- 「ULD管理」5.5 寸手机端适配（app 模块首个适配页）：列表卡片（三色状态标签）+ 筛选弹层（入库时间/进港航班号/所属航司/来源）+
  右下角浮动新增 + 底部全选/批量删除（循环调用单条删除接口）+ 一套 `activity_uld_edit` 手机布局覆盖 新增/修改/详情 三态
  （详情态右上铅笔进入修改、状态底部选择面板、所在港默认 HFE、必填校验仅手机生效）
- 新增手机版公共组件 `PhoneFormRow`（行式表单项，INPUT/SELECT/DATE/TEXT 四形态，SELECT 内置底部选择面板）；
  `PhoneBottomBar` 增加 `actionDanger` 危险按钮样式；新增 `bg_phone_fab`、`bg_phone_btn_danger`、`bg_phone_tag_red_light`、
  `ic_phone_trash`、`ic_phone_edit` 等资源
- `ULDBean` 补解析接口既有出参 `ifNo`/`efNo`/`checkInDate`/`checkOutDate` 并预留 `source`；后端缺口 5 项
  （状态三态、来源字段、筛选入参、批量删除接口、字段语义）登记问题清单 #7~#11

### 验证 (Verified)
- ULD管理双端实机验证通过：手机端列表/筛选/详情/修改/新增/单选全选/批删确认全链路 crash=0、方向无闪屏；
  平板端列表与详情回归无变化

### 修复 (Fixed)
- 出库交接手机版「待/已交接」Tab 与角标计数的过滤参数名修正：`hoState` → `handoverState`
  （以 api-doc 接口文档为准；此前误传 `hoState` 被后端静默忽略，两个 Tab 返回同一批数据）。
  2026-07-29 内网实机验证通过：fdate=2026-07-16 下待交接/已交接 Tab 分别精确返回对应板箱，与后端直调结果一致。
  验证中发现 `IntExpOutHandover/pageQueryTotal` 出参恒 0（后端缺陷，致 Tab 角标与平板底部统计为 0，已记录问题清单 #6）

### 新增 (Added)
- 新增《后端接口对接问题清单》（`documents/后端接口对接问题清单.xlsx`）：手机端适配走查发现的接口缺口
  （移库列表缺航班字段、缺操作人姓名、`opId/opdate/businessType` 不回填、出库交接查询缺「交接人」入参），
  按模块/页面/接口定义/接口地址索引，作为与后端对接的持续维护文档
- phone-adapt skill 新增 `references/api-doc.md`：api-doc MCP 连接与逐接口核对流程，接口对齐从「问用户」升级为「先查接口文档」

---

## [1.9.0] - 2026-07-29

### 新增 (Added)
- 5.5 寸手持端双形态适配框架：同名布局 + 资源限定符（`layout/` 手机、`layout-sw600dp/` 平板）自动切换，业务逻辑（ViewModel/ViewHolder）零改动
- 新增 `DeviceUtil` 设备形态判定工具，及手机版公共组件库（`PhoneSearchBar`、`PhoneStatusTab`、`PhoneDataLayout`、`PhoneFilterPanel`、`PhoneBottomBar`、`PhoneStatBox`、`PhoneKvItem`）
- 完成「国际出港移库」「国际出港出库交接」两个页面的手机端适配，含各自的详情页（`IntExpMoveDetailActivity`、`IntExpOutHandoverDetailActivity`）
- 手机端首页菜单接入「出港移库」「出库交接」入口

### 修复 (Fixed)
- 修复手机端进入页面时「先横屏、约 1 秒后转竖屏」的闪屏问题：Manifest 统一改为 `android:screenOrientation="unspecified"`（全项目 192 处），由 `BaseActivity.applyDeviceOrientation()` 按设备形态在运行时锁定方向，避免系统建窗口时用错误方向
- 修复平板端因中间方案（`@integer/screen_orientation` 资源限定符）引入的回归：先竖屏再转横屏，且交互后 UI 整体放大约 1.6 倍（AutoSize 误选平板竖屏基准所致）；验证系统解析 Manifest 属性不套用设备限定符，恢复为 `unspecified` 方案后两端方向与缩放均恢复正常
- AutoSize 增加手机竖屏专用设计基准 390×844dp，避免手机端沿用平板竖屏 720dp 基准导致 UI 压缩

### 技术栈
- Kotlin 1.6.21
- Android Gradle Plugin 7.2.0
- Gradle 7.3.3
- minSdk 24, targetSdk 30, compileSdk 31

---

## [1.8.4] - 2024-12-02

### 新增 (Added)
- 完善 Claude Code 配置,添加 Android 开发权限
- 创建 8 个快捷命令 (/build-debug, /install, /logs 等)
- 定制 CLAUDE.md 为 Android 项目专用开发指南
- 添加 CONTRIBUTING.md 贡献指南文档
- 添加 CHANGELOG.md 版本变更日志

### 改进 (Changed)
- 优化首页菜单交互体验
- 改进 UI 界面显示效果

### 技术栈
- Kotlin 1.6.21
- Android Gradle Plugin 7.2.0
- Gradle 7.3.3
- minSdk 24, targetSdk 30, compileSdk 31

---

## [1.8.x] - 之前版本

### 主要功能
- 国内出港业务模块 (货物收运、复磅称重、转运管理、出库装机)
- 国内进港业务模块 (舱单管理、卸机入库、出库提货、移库管理)
- 国际出港业务模块 (国际货物收运、板箱组装、ULD容器管理)
- 国际进港业务模块 (国际舱单管理、报文解析、理货管理)
- 航班管理模块 (航班查询、航班统计)
- 货物追踪模块 (货物状态追踪、运输日志)
- 监装监卸模块 (监装监卸管理)
- PDA功能模块 (PDA专用功能)
- 蓝牙打印模块 (佳博打印机集成)

### 核心架构
- MVVM 架构模式
- 组件化模块设计 (11个业务模块 + 1个基础库)
- DataBinding 双向绑定
- Kotlin Coroutines + Flow 异步处理
- ARouter 模块间通信
- Retrofit + OkHttp 网络请求
- Glide 图片加载
- MPAndroidChart 图表展示

### 开发基础设施
- BaseActivity/BaseBindingActivity 基类
- BaseViewModel/BasePageViewModel 基类
- CommonAdapter + BaseViewHolder 列表适配
- PadSearchLayout/PadDataLayout 自定义组件
- 完整的 Kotlin 扩展函数库
- DataBinding 适配器集合

---

## 版本说明

### 版本号规则
- **Major.Minor.Patch** (例: 1.8.4)
- **Major**: 重大架构变更或不兼容的 API 修改
- **Minor**: 新功能添加,向下兼容
- **Patch**: Bug 修复和小的改进

### 变更类型
- **Added**: 新增功能
- **Changed**: 功能改进或变更
- **Deprecated**: 即将废弃的功能
- **Removed**: 已移除的功能
- **Fixed**: Bug 修复
- **Security**: 安全性修复

---

## 未来计划

### 待开发功能
- [ ] 优化数据同步机制
- [ ] 增强离线模式支持
- [ ] 改进用户权限管理
- [ ] 优化蓝牙打印稳定性
- [ ] 添加数据导出功能
- [ ] 性能监控和分析

### 技术改进
- [ ] 升级到 Kotlin 2.0
- [ ] 迁移到 Jetpack Compose
- [ ] 优化构建速度
- [ ] 完善单元测试覆盖
- [ ] 添加 UI 自动化测试

---

**维护**: 本文档应在每次版本发布时更新。
**负责人**: 项目维护团队
**最后更新**: 2026-07-29
