From bbc29ca2e1de956de50727e360e2cb984a4ac82c Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Wed, 29 Jul 2026 15:13:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=87=BA=E5=BA=93=E4=BA=A4=E6=8E=A5?= =?UTF-8?q?=E4=BA=A4=E6=8E=A5=E7=8A=B6=E6=80=81=E5=8F=82=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E6=94=B9=E4=B8=BAhandoverState=E5=B9=B6=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=86=85=E7=BD=91=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 按 api-doc 接口文档修正交接状态入参 hoState → handoverState(原参数被后端 静默忽略,两个 Tab 返回同一批数据);内网实机验证 0/1 过滤与 App 端到端链路 均生效,平板端回归无影响 - 新增《后端接口对接问题清单.xlsx》:按模块/页面/接口定义/接口地址索引的后端 对接文档,含 5 项待处理缺口(移库缺航班字段/操作人姓名/数据不回填、交接缺 交接人入参、pageQueryTotal 出参恒 0)+ 1 项已验证归档 - phone-adapt skill 新增 references/api-doc.md(api-doc MCP 核对流程 + 内网 直调验证技巧),阶段 2 改为「先查接口文档再问用户」,修正 verification.md 中「后端不认 hoState」的过时误判结论 - CLAUDE.md / CHANGELOG.md 同步走查与验证结论 Co-Authored-By: Claude Fable 5 --- .claude/skills/phone-adapt/SKILL.md | 27 ++++-- .../skills/phone-adapt/references/api-doc.md | 86 ++++++++++++++++++ .../phone-adapt/references/verification.md | 12 ++- CHANGELOG.md | 16 ++++ CLAUDE.md | 10 +- documents/后端接口对接问题清单.xlsx | Bin 0 -> 12337 bytes .../viewModel/IntExpOutHandoverViewModel.kt | 8 +- 7 files changed, 143 insertions(+), 16 deletions(-) create mode 100644 .claude/skills/phone-adapt/references/api-doc.md create mode 100644 documents/后端接口对接问题清单.xlsx diff --git a/.claude/skills/phone-adapt/SKILL.md b/.claude/skills/phone-adapt/SKILL.md index 011853a..4924e42 100644 --- a/.claude/skills/phone-adapt/SKILL.md +++ b/.claude/skills/phone-adapt/SKILL.md @@ -54,12 +54,22 @@ python3 $S/design_shots.py --html "…/出库交接.html" --out /tmp/design \ 把设计稿的每个筛选项/Tab/字段,对照平板 ViewModel 已有的字段: - **已有字段** → 直接复用(如出港移库的 Tab 直接绑既有 `moveState`) -- **平板没有的新维度**(新 Tab 状态、新下拉、新排序)→ **停下来问用户**要用什么接口参数名, - 连带问数据源(如「交接人」用 `DictUtils.getWHSUserList()`) +- **平板没有的新维度**(新 Tab 状态、新下拉、新排序)→ **先查 api-doc MCP 拿权威参数名**, + 流程见 `references/api-doc.md`(连接方式 + 5 个工具 + 逐接口核对清单)。 + 文档里查不到、或业务语义拿不准(如数据源该用哪个 `DictUtils` 方法)才用 `AskUserQuestion` 问用户 -这一步不能猜。出库交接就是实测发现后端 `pageQuery` 根本不认 `hoState`,两个 Tab 返回同一批数据—— -参数名对不对只有后端知道。用 `AskUserQuestion` 一次问清,并在阶段 5 用真实请求体验证是否生效; -**没生效就在交付说明里如实标注**,不要让它看起来是通的。 +这一步不能猜,也**不要拿「实测不生效」当结论**。出库交接第一版猜了 `hoState`,实测两个 Tab +返回同一批数据,一度误判为「后端不支持」;后查 api-doc 才发现正确参数名是 `handoverState`—— +后端对不认识的参数是**静默忽略**,不报错,实测只能证明「这个名字不对」,证不出「后端没这能力」。 + +核对完把结论落两处(模板与格式见 `references/api-doc.md`): + +- 后端真实缺口(缺入参/缺出参/数据不回填)→ 记入 `documents/后端接口对接问题清单.xlsx`, + 这是与后端对接的正式文档,按「模块 → 页面 → 接口定义 → 接口地址」索引,**每个页面适配完都要维护** +- 参数名/字段绑定错误这类前端问题 → 直接改代码 + +阶段 5 仍要用真实请求体验证新参数确实生效;没生效就在清单文档与交付说明里如实标注, +不要让它看起来是通的。 ### 开工前对齐方案 @@ -121,7 +131,7 @@ visibility 即可(Bean 上加个只读计算属性如 `isHandovered` 让 XML val handoverState = MutableLiveData("") // 平板布局无对应控件 → 恒为空 → 不进请求 val filterParams = mapOf( /* 原有字段… */ - "hoState" to handoverState.value?.ifEmpty { null }, + "handoverState" to handoverState.value?.ifEmpty { null }, // 参数名以 api-doc 为准 ) // 手机专属的额外请求(Tab 角标计数、新下拉字典)用内部开关控制 @@ -252,11 +262,13 @@ binding.rv.postDelayed({ ## 收尾:文档与交付说明 -代码之外还要落三处文档,否则下一个人会重复踩坑: +代码之外还要落四处文档,否则下一个人会重复踩坑: - 新增了公共组件/资源 → 更新 `CLAUDE.md`「手机版公共组件库」表 + `references/components.md` - 踩到新坑(崩溃、静默失效、环境问题)→ 写进 `CLAUDE.md`「常见编译错误速查」和本 skill 的 对应 reference,把**定位手法**也写上,不只写结论 +- 接口有后端缺口(阶段 2 / 阶段 5 发现的)→ 维护 `documents/后端接口对接问题清单.xlsx`; + 已确认的字段语义追加到 `references/api-doc.md` 的「已核对过的语义」,别让下个页面再查一遍 - `CHANGELOG.md` 追加条目(新增 / 改进 / 修复 / 验证 四段),记忆文件 `phone-5.5inch-adaptation.md` 同步 @@ -270,6 +282,7 @@ binding.rv.postDelayed({ ## 参考文件 +- `references/api-doc.md` — api-doc MCP 连接与逐接口核对流程、后端缺口记录规范、已核对字段语义(阶段 2 前读) - `references/components.md` — 7 个手机版公共组件的属性表、用法与封装新组件的规矩(写布局前读) - `references/pad-safety.md` — 布局变体约束、Pad 零破坏模式、易崩点(写代码前读) - `references/verification.md` — 双端 adb 命令、登录与直启、已知环境坑(验证前读) diff --git a/.claude/skills/phone-adapt/references/api-doc.md b/.claude/skills/phone-adapt/references/api-doc.md new file mode 100644 index 0000000..6368bc0 --- /dev/null +++ b/.claude/skills/phone-adapt/references/api-doc.md @@ -0,0 +1,86 @@ +# api-doc MCP:接口定义核对流程(阶段 2 必读) + +适配页面前,**所有用到的接口都要在 api-doc(AgentFox)里核对一遍入参/出参**, +不要靠平板代码或猜测推断参数名——出库交接就因为猜了 `hoState`(实际是 `handoverState`) +白白折腾了一轮实机排查。 + +## 连接方式 + +项目 `.mcp.json` 已配置 `api-doc` 远程 HTTP MCP。若会话内 MCP 工具可直接调用 +(`mcp__api-doc__*`),直接用;**若工具没有注入会话**(ToolSearch 搜不到),用 curl 走 +MCP 协议手工调用,三步: + +```bash +URL=$(python3 -c "import json;print(json.load(open('.mcp.json'))['mcpServers']['api-doc']['url'])") +AUTH="Authorization: $(python3 -c "import json;print(json.load(open('.mcp.json'))['mcpServers']['api-doc']['headers']['Authorization'])")" + +# 1) initialize:从响应头 mcp-session-id 取会话 id +curl -s -D /tmp/mcp_headers.txt -X POST "$URL" -H "$AUTH" -H "Content-Type: application/json" \ + -H "Accept: application/json, text/event-stream" \ + -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"claude-code","version":"1.0"}}}' > /dev/null +SID=$(grep -i 'mcp-session-id' /tmp/mcp_headers.txt | tr -d '\r' | awk '{print $2}') + +# 2) initialized 通知(必须发,否则 tools/* 报 session 未初始化) +curl -s -X POST "$URL" -H "$AUTH" -H "Content-Type: application/json" \ + -H "Accept: application/json, text/event-stream" -H "mcp-session-id: $SID" \ + -d '{"jsonrpc":"2.0","method":"notifications/initialized"}' > /dev/null + +# 3) tools/call(响应是 SSE,`sed 's/^data: //'` 后按 JSON 解析) +curl -s -X POST "$URL" -H "$AUTH" -H "Content-Type: application/json" \ + -H "Accept: application/json, text/event-stream" -H "mcp-session-id: $SID" \ + -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_endpoints","arguments":{"keyword":"IntExpMove"}}}' +``` + +## 可用工具(5 个) + +| 工具 | 用途 | +|------|------| +| `get_project_overview` | 项目概览 + 模块清单(首次调用) | +| `list_modules` | 全部模块含描述 | +| `list_endpoints` | 单模块内接口列表(分页,`moduleId` + `cursor`) | +| `search_endpoints` | 按关键字搜接口(`keyword` 用控制器前缀最准,如 `IntExpOutHandover`) | +| `get_endpoint_detail` | **核心**:单接口完整契约,schema 已拍平成字段表(`endpointId`) | + +## 核对清单(每个页面做一遍) + +对 ViewModel 里每个 `NetApply.api.xxx` 调用: + +1. 从 `module_base/.../http/net/Api.kt` 拿到 `@POST` 路径 → `search_endpoints` 找到接口 → `get_endpoint_detail` +2. **入参**:前端传的每个 key 必须能在文档字段表里找到**同名字段**;找不到 = 传了也白传(后端静默忽略,不报错) +3. **类型**:状态类字段(`moveState`/`handoverState`/`outState`)文档均为 integer,前端传 `"0"` 字符串靠 + Jackson 隐式转换(实测可用);新代码尽量传数字 +4. **出参**:设计稿卡片/详情页的每个展示字段,都要能对上出参字段;对不上就是后端缺口 +5. **结论落两处**: + - 后端缺口(缺入参/缺出参/数据不回填)→ 记入 `documents/后端接口对接问题清单.xlsx` + (按「模块 → 页面 → 接口定义 → 接口地址」格式,含前端现状与期望,状态标 ⏳/🔍) + - 前端可自行解决的(参数名写错、字段绑错)→ 直接改代码,别记成后端问题 + +## 已核对过的语义(别再猜) + +- `IntExpOutHandover`:交接状态入参 = `handoverState`(不是 `hoState`),**2026-07-29 内网实测过滤生效** + (传 0/1 分别返回纯净的待/已交接集合,字符串 `"0"`/`"1"` 同样被接受);`ldId` 是**组装人**不是交接人; + 交接人姓名出参 `hoUserName`,编码 `hoId`;查询入参**没有**交接人筛选(后端缺口 #4) +- `IntExpOutHandover/pageQueryTotal`:**出参恒 0**(任何条件下 totalPc/totalWeight/wbNumber 均为 0, + 与同条件 pageQuery 不一致,后端缺口 #6)——依赖它的 Tab 角标/底部统计显示 0 不是前端问题 +- `IntExpMove`:出参无航班字段(缺口 #1)、无操作人姓名(缺口 #2);`opId`/`opdate`/`businessType` + 文档有定义但实测恒 null(缺口 #3);`pageQueryTotal` 正常(与 pageQuery 口径一致,`moveState` 过滤生效) +- `typeCode/getSpecialCodeByParam`:`flag=1` 国际,`ieFlag` 必须传空串(传 `"E"` 返回空数组) + +## 内网直调验证技巧(比驱动 UI 快得多) + +登录态 token 存在 SharedPreference 里,取出后可以直接 curl 后端做行为验证 +(**注意:不要把 token 打印到输出里**,落临时文件引用): + +```bash +adb -s shell "run-as com.lukouguoji.aerologic cat \ + /data/data/com.lukouguoji.aerologic/shared_prefs/data.xml" \ + | grep -o '[^<]*' | sed 's/.*>//' > /tmp/air_token + +curl -s -X POST "http://192.168.1.250:8093/IntExpOutHandover/pageQuery" \ + -H "Authorization: $(cat /tmp/air_token)" -H "Content-Type: application/json" \ + -d '{"pageNum":1,"pageSize":50,"handoverState":0}' +``` + +用它做「参数是否生效」的 A/B 对比(同条件只改一个参数看 total 变化), +再回 App UI 走一遍确认端到端链路。UI 里的滚轮日期选择器可用 +`input swipe`(慢速 500ms、每次 3 格 ≈ 396px)驱动,滑完截图校准。 diff --git a/.claude/skills/phone-adapt/references/verification.md b/.claude/skills/phone-adapt/references/verification.md index 0499784..4bd91bf 100644 --- a/.claude/skills/phone-adapt/references/verification.md +++ b/.claude/skills/phone-adapt/references/verification.md @@ -101,11 +101,14 @@ $P texts | grep -c "全选" # 用文字变化确认点击确实生效 $P req pageQuery ``` -OkHttp 日志是多行 pretty JSON。看到请求体里有你的字段(如 `"hoState": "0"`)只说明客户端对了。 +OkHttp 日志是多行 pretty JSON。看到请求体里有你的字段(如 `"handoverState": "0"`)只说明客户端对了。 **服务端是否生效要用行为验证**:切到另一个 Tab,看返回数据是否真的变了。 -本次实测:请求正确携带 `hoState:"0"/"1"`,但两个 Tab 返回同一批数据 → 后端没做过滤。 -这种情况**必须在交付说明里如实标注**,不能让它看起来是通的。 +⚠️ 行为验证失败时**先怀疑参数名,再怀疑后端**:出库交接第一版传 `hoState`,两个 Tab 返回同一批数据, +一度误判为「后端没做过滤」;实际是参数名错了(api-doc 里是 `handoverState`),后端对不认识的参数 +**静默忽略**。正确顺序:查 `references/api-doc.md` 核对参数名 → 用 token 直调后端做 A/B 对比 +(同条件只改一个参数看 total 变化)→ 仍不生效才定性为后端缺陷并记入 +`documents/后端接口对接问题清单.xlsx`。 ## 无数据时怎么核对 UI @@ -136,7 +139,8 @@ for i in $(seq 1 10); do adb -s shell dumpsys window | grep -m1 -oE "mRo ``` 平板则应首屏就是横屏(截图宽 > 高)。若手机出现横屏帧,检查该 Activity 的 Manifest -是否漏写 `android:screenOrientation="@integer/screen_orientation"`。 +是否写成了别的值——**必须是 `android:screenOrientation="unspecified"`**(写死 `userLandscape` +或用 `@integer/...` 资源引用都会出问题,详见 SKILL.md 阶段 4)。 ## Pad 端回归(必做) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fb81c4..1370eca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 +## [Unreleased] + +### 修复 (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) diff --git a/CLAUDE.md b/CLAUDE.md index fe62cfb..29d5377 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1089,12 +1089,18 @@ override fun dispatchRestoreInstanceState(container: SparseArray) = - ✅ **已完成**:适配框架 + 手机端公共资源 + 7 个手机版公共组件 - ✅ **已完成页面**: - - 「国际出港移库」`IntExpMoveActivity`(框架参考页,筛选弹层内暂仍用 `PadSearchLayout`) + - 「国际出港移库」`IntExpMoveActivity` + 「运单详情」`IntExpMoveDetailActivity`(框架参考页) - 「国际出港出库交接」`IntExpOutHandoverActivity` + 「板箱详情」`IntExpOutHandoverDetailActivity` (公共组件首个完整落地页,双端实机验证通过) - ⏳ **待办**: - - 把「移库」页筛选弹层内的 `PadSearchLayout` 换成 `PhoneDataLayout`,视觉统一 - `PhoneSearchBar` 接入 AutoQuery 联想(`AutoQueryManager` 目前只对接了 Pad 系组件) + - 出库交接 Tab 角标恒 0:`IntExpOutHandover/pageQueryTotal` 出参恒 0(后端缺陷,问题清单 #6), + 后端修复后角标自动恢复(`handoverState` 过滤本身已于 2026-07-29 实机验证通过)生效 +- 📋 **接口对接**:适配中发现的后端接口缺口统一记录在 `documents/后端接口对接问题清单.xlsx` + (按模块/页面/接口定义/接口地址索引,与后端对接的正式文档,每页适配完必须维护); + 接口入参/出参一律以 api-doc MCP 为准核对,流程见 + `.claude/skills/phone-adapt/references/api-doc.md`——**后端对不认识的参数静默忽略**, + 猜参数名会得出「后端不支持」的误判(出库交接 `hoState`→`handoverState` 已踩过) ### 调试便利:直接拉起页面 diff --git a/documents/后端接口对接问题清单.xlsx b/documents/后端接口对接问题清单.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..520c677906eb1eaf66f7bd8bac1153d9bb8a0f09 GIT binary patch literal 12337 zcmZ{K1ymf{wr%6??(QzZo!}na-QC^Y-95NA1b2dyMuJOY!8K?gSok^T{`b$j`S*5@ zsv0%A=j__6R;{^v?Ww8&1&s{=0N?@1KCcGS<4Urbzt5(BZ|J`_3ukjxH)j`jHd7ZD zRv$+PrCBAUA$DZgoq-Qt9l3F&<*4t4?E-#=(oqT;Kh(5B$Qqs2P zNL{n;J92T3qlhh2J&Az6l*X0r`!{lIh9)!r= zLtro`&VBfO=}eFS0LK3wg1NJs2FN}%Bo4*L*%c>FdDHsb^aw!!}SAor&WsZj;ir&+szT4 zRE;v%pEwQW>ErKu6oaP8czRgspz)-JvSW2Fd?@fFwt!nQE5SSIWvDUKvdz5kw3aHRw0e}KJ008TElzbf6JZvl-E&sLW_$y8qdiw6`eAq#k zz^^{m_l`(oJfZEaSnjr7;MUxT3uUrM44p&=UyIa;-~kyPbWj$`MVeA~z7RC?$@7eq z%+WEQ@9lS1v*W0kj2j=5H8${aPY2u9jy5MXhB!Mx74T{hu|mP=^l)SBSlw5T zGh14^*GBvD6I>e!>Af>QOq{j@u?2E~j*Hjw)I3y{5yO*b2H_e>&!)J+mCkqmSd3p| zqtMH?^8{Jk(r$$*FsK0DkvT=x0HAn#+|E$iyg|zHEJK?rA$;CM=nt7NiqQ?=>yPZ7 z$#O2g!a#u;`;1`QI*6)^p8VPL7x&}+;;Qr&C5aiAUS@>rXDWTuXgViBEH?pSYl(o_ z`}@=i8qV3vN5nH_A!{#e^d!4|06&WY0m72j8%9RXhYN_H0mhOEF zzBV}&PApOQ!l)cORbt3;1dgoIsGqH4^%y%?fgSzu6WfU~4|UFY!rG-ea_bR4(WMD@ z3)~Og=Nz8lDx~M`HG4P8vUPAEvhlaMYu_=CF8gE-UN;m7kzip?XCT3fM`csfV%G2n zDam5}VyamGRj?p-mBB{+B%hjW+d@_4K|6iSMfh17NaPu9GcV-#3+A!l9U^fm5ecL< zQHwN1gl*3iDUdoTuVDy-NkYVofQQhn4L7viwI;$u4|8nJM|r*#<3+drUAljU{dhHB~TH;pB!Z%hN^Zi_o$wu8rmvsV3z_gt_h_6*=(pLFCOE>s4(G^M`nwTjw3B`x!RK zAIus!TXETSCtNz;!Alir{dpl?e@og)f8@E5V||62mEK(2ZF*u{1DMXR%3nNq{%Rvq zbbax(MjZjn(`BK;O;HGK5vT5aiT`rNID&9&p-+PV(pa$Mjl(RGAaXiU{~@2basce2 z?-bJCKLM6{h%nDS3K<`@P9t$icDN~=wrBLW(elaPHBY%HlY)>1t%cG^+PzCi-aX$N zdhJtHu&ZZFb`nbTLpgRAZV2!d<)n5YE__IF9)3I-^&#BlUxV%n%+Yo{TAiDFKKiWI zRCXzpMKT_9^O53vX;jYauw=Bazj2Or=9nrswxdHmHM4YwN$1KnGxm;!2}=oFI8Y7p z=7XjQhyEB8Q_9Bx#RREim!oV0m$kuj8UkuYV=Gw>?qKi(3k_a8CIjcD=>NO84eX5;tn9ge#y zt9N30wWC3DcJ=Vr_*rsTSKe&1AR{pA$LM12Dj8lZ9px7^`cZm4WqW@%xp{S<DWX zJTksBlxz&T-`sn0N*9z>Ebtx0fbfulq{<|Q#l_>?SN)!r0*eJPoiX|T3Np;1k~k#i z390V}xr+g3ra^>1Sc*A3O4(?h1`|832^oe0&u#DWGTqKQVdaTA)GVF+dp8v88F2CR0K@M1~ z)2pyx!Vpz}3m{8_HBZpL<2FvlHfyMCZWvqVK=uvMxkWCu;@ggv$|K}jim&HSM06Hk z5<3tDFQVAoqi_?a!WePnw)2$jDn* z&e64B1=Tx$+U)JI%FJ+!Z1#BS?dth-*wHdbRwcnZHgZ z*ur>&c=nf6a6rS9kKoRB-R`fiPl6n22AK!NhX)S6LR4ImzWUU~Y+h%XhD_SQ6YH4nxD;8^RVU_>|1L2ualJyy-ECd^l#&QPQ&ld3VU z*~TyHamU%0eu3S8#V;`(pV+z57iFG_YJpDgeJZUdKXvMEG}LW_o)?BrRG>5|K%pV*^Ff$2r!FtagnjVTU zuar`XEXmBkD-MGdL7bD)g`mr48bfnId#oB&isQyhfo6$6k4dxTwy!W++14y+-$Kz| z&CA<%uRI5=R~IqXh)*vI^esNW@YxGU#9I6gf9>fgt&=@|B~aARPJ6{xD;!`5@%eQB z8cmTsZTg#>6zh?UEet5v`J}DvYJoa3p>{*n#Ndzvaki5Fs(@WG^h_}hKk_JDNLJ1* zgEIYaGLrgGE~bPdPBi$P)EL2MI&F@)0Y&+mE-QDY2FydbwoiH1VbZ<<*KOFL)^gK5 z^Ah9qMauFGK28-;RjGLjES(hv*38n^4r!D$%YuBzb5~<-Qkj8nI7@pVxj3)NYlB=% z4n!dB4_YouM+WHTcFp&ou51yB>mSrA%%BF3+-2&L6p5x~3=q4SJ124TRO9Hm9&D#* z(buv&b3sZl)$RuSVizucF7=9*IiY!>`p(Li*}+@V*F6XQ*B9G|$`_p%F5LcfkX&tj zI{oLbt%~b(G>ZbM6OP9}*{!iZE+nSk$|MJ?rrA37v4EgOE&w}Nz3db>Zt}3@7;T%k zmvs$vUSf^R9SaVW2rq-a(u?KV1jG#tZ^a*IhE}Y4CRpge&6@ zQ-^Nzm-7j#SOskH#Ubc$syJn-!qeKiwXjSN*kj3UVV!eXhZ|XL5q!>>u0HOnAfW5A zj8Zk5W@)V$=W}r$2vgekExfHzPX$BA7dCjnY#;q@)Y3x zRktKCK{(p-D4Hso z(vz=9JH=&{NGs>a299G;faMRGbgJe{iPPC}1mfb@)U-rCARtas6>u=PaYiKp$J%U! zej!X2H3>!4OS=0{Ojf0)Kcu9?OiaER?H3q00r<}{=EafplT2$db3IX~NRppy@ck@! zJ4RJ+p6w1ltGN|y0wpII<_3sq=rZxG93(R9uh|*AtwFdGa*0a}->Q+TD@R_=eaXI| zqeffd;~epz#odx{Mx8CEH5as}Vqx}8JMK{O6#Myw z`##^*;cSLVtKL0JHoti`GYF|m|A37Hs5$UhttZqqE@ykQyS0r9^R$dwj6^t1NKp}> zx0sVQB}uo?1D$?cbo%Q19h%4RoJ@%$)(qdqJ5JS0V+0dskA8@E^WdX|iG?&l&iNS* zvCzpm7HVtbgqAbH%^pk2ehtVO*+x=K2L-a3*hv_%Djp+8!(){pNnIL?b76#G=Jfj5l_7m>N^BsZKx*n(mKH{yw zEgZS@WB<{{DOVyX%c*`zPmp~;0I|ba8yB-AlnZvarEk_si28Wf7;^GhRNK#9xn&c) zj)5cU2L|MM;(n-1-%ow|zcQ*6Q$!q{fDvn8x3xSHKt7BjPlCDZQyo|Pw)L+XH;z#mw%rUL&n`MyKDu-A3 zkv_XMz)8R7y3mMJUTV~e8k7s5;&c7jU{IMA_kFaVFx#5AAnNdbP)<2K{X8@seo*dL zGJ;3%*K3m>_l*LE4%sOS_i9sl`(}U^zRcWs7e&q?IxI^TEjU-5AehW#IX#^$0<_mK zM+Gl_nkRfa;re-hdf2rRG>5SoT^3#B`mrvDa7|Dzij{C4@pWT8?iqfo(n;0HI=6Se zIFuo{ymHuYK=S%}zwt0zKxbC1tf#o6;!MNf3_cuPp3jqo=7P5_sD(|=xiHExEIY03 zk#ZIG$%{Q>;Ro3n4QENU2a#GQn0}KKm|nXUw3N`!-owf<*s-VsU7)-ki9W(7p}K!H z!P=S*7vscbgS{@nA~6TAfuK#NQw^Khq&z7eY3AtByi1K^a@69cTTT{tn!JFtP}Aq- z{|!P>z|m-Uhhs5cL&B&3P#)v`W%)gBFm-sXn61C5wUcNsMAULBZTm{V0ki^7N6S7E zN(bKOwjmtLBqxk3T|t73_l1|}7DAZFzvx5HrW{3>gl_8}MBH#k*RpRuuY+8{2~=89kykkP=l{hpBA#)}9`GZXCQ?0C0ZL9@uhh1Z*$t`!&C* zcB2LMwRP)wqaI^)fyASI;q<)ZfTUkcShBcpg~mxwzSUg4Brz~|5>PMG3g36TO}P8} z&qxQ@ese0#>EEh^agV0f;#4HsD&^tcXvLeK9CZeQ^AQc^z4$3295g>Twnbp_1nmXj z4k9u2mgrv^6y699H&2rgiO6|e!v`CB4r2?eOg$b%cJary!B-;mJTF&6ah5iyMS)VC zK|69nR4Yk%)H^jJU4N8t{~v6Jx^4O1&Mf4dte3J zmsZ5s5HsnV!av+ue1b=W$P?6B zw;%AjGEbY=;zG)-SiAY4D?ePoOEBVF*vLM^uEXuN|CuUg;K^tFBG?n0Ml1fTLA<7P ziH**3$ys<<;*A2G%Qo`rncbaLYiL;GrMoB+u)v|Dsl*s}S~pqDy7E+i(f;DUB4@Yi zx*cxMESZ36g!+jiZ=)f*`q+jo+%^|8E-_Hsa;I-X*QJPHeH2`l^h96P3=Xk9V+GEg z6NQ{E-KW&Y6UETqaEITUBx{QFYaGmMiH_7=_}q5rFjD|b009FGpf3YCM8iLVN%$WB z=&Zmx$#V%p0|0X<|8-)_`B!_TE!)u<%!58Y5LW`>-x0SP{{CHiD6Rb*;0%}h>^`sA zR==9s4qKh>^-hq~a!uKihA4%%@~2BMX|Pby!Fd6DA2s@dw*kQVDDn) z+Vmdx7H_WhUy3xS4~WkY@=x01yVKhgn(Z6i5RQn(k*Q$z1N zlE=&qg4-qSM(x|25u>iTxjjeyOg`;>#pisZ9wtN05}7?&7Q;uS?ZGDB0P6y-wo5p+ zLbtE2?T0;1F3N_s_(=V&qR6O}ebvUhqJ0C`O~jXr*AH8_XcIVmn>EVDxu=(I2ko~y zV{`JrrN9G`{7sq77EB{&+gjA%GDCcj4>8N7;8i6rEZXTOgbKf70x|+sx3Q3W*t=Nq zpqY>#u*i6XLc^A?wFP=p^=neg$*}L4KJDOyH@$z>fCicl8@Gl!tcu+u67e{eve30F z$WlVe*29@hDrYu2@B}}ltf^mz@Aq4LD_|FCCn~ZNkxE6wetavzrxjIk)oal+1dhQg z>zmrdqUTXtQV_rg5u24e<4L)OxP)}5P>PH+iz-NkV_l5^RC*=gmF=CT zvz5Wynhj;t>v^te3z$b*=jzg-(YHAT=Vv!RzhW{BnPzuVNv=ngi^J~9c?8i)!yMX6 zyZw~RF)2i;Z_$Qdw4HWj^E_i?H!rA~meDe9Lgp=we;Mp>DA=;;K~u#v&3d0w1=+M$ zbGiTiWz{$4b|E5|@B*Eas*azc2yNsR5B&`~#3;f~uO2qHC8tU$Q0K!7kl@o!@Mr+z z74)t859_zmeSoU6F&wFWXJwuvkoc~&Ixc)9UI$*co1t)M;+hj3US&$^U6Dxsv zc7L85&wF>w_E}M(X*%|OEw&}y>l14eKx(dhO=w>VUGChB&3cyA*UxyV*t=tyXCGu` z_#L+eT)8HqkhXcV>~yoaU}vx3<7T*&-x~^gqFr;e&jbK{SSruX-wBwX z?bQbx7$ALPslKs>wA!9ysHvpxxZ&RPX_BbZ(@^_ueZJUs1@}IT1q_$3CZ~F8@ItpL zXus(y?fE7HGJfuqC}_MX4AgCSW7V3zFtf6w-Ae)&`qS@E)y%l9l71O?=;ogXwLj+QGFRq52GGSY zp?%TzO)oB7UJ|Z(4T9^3g4g4d2xQqrMe}6_j@Hu~elzBIC&VIV>VCh6X5f}LV`|B% ze!EZ}y0_6{LBQRcvzWqJ$d6)B?I1f0VnCrR+ptBa)pU~`u9G9m_(LJ}#z2?3v zBkgI!&Tdi2PqgGZV4k+fYO7}ve|;fEthpTr1RmNqsvy*?!QmZ)Qsr1cA# zg(Y!?3127f{+l}sfyiutc-xVTXs5~CfTXNooz>P1oa;pAJjp9FDC`vxgz_~_M7CYf z*hEOL=d05ds2J*cuhQMgo^6lw=P1nF;nNjGx3+ZVHm?U= zkfhaNb75-4owMoO_40aY|6OM$9vQ1>>b`gyCU3=CbH|Srx^zJiO{IR)Q{(h&1UW(0 z>eBvq6>{t}60vp*ESn;c;wKb}8}4rUhTW3`l8KCxabIm$qc!&Bx3}?9K&TZav0m~y zLq6#H$3l<_`CpH_VqWTc#u$^rL*rIHOg4TLlU2aGhLZ=w5y{>nB?Qh@vg}&YB zTPVpR?lHF{DfGv}^Z@;W`q~Pv0zz@9_80M*ySdm0)3nrHdp_cVcGy&KNJbexo~607 z14&;QwC{~+EaW-?0dN~G^-=`}jz1egwo|0^1YtI&W5pWhl_1ZKHWeu&nMDb%;D?@_ zP$&n99_DVm_0*oENgP!niT0rDJ}$Ru`GRF>yxFp@AGDIru*qn0H~YKQiX0OWu|b}X z;d%WhVRhJs>gVXkrQ(j9vgQo2p9#X{j<-_hQ0yQ$IMBP>_3a&#DpS#`+U-TM`hIE55b)$XudJ~dv2%J^!@z|p^hl9 z`8v?9BJ;QHfhk!@7{|@Sp;Qvn&v$Z)l&M@V=f|Jo*UplzNDmmhh-d33CtR{i@o)9`NwpJq@JAk(Ouc=R$VWg)PuMq*T4 zvTGhq<1SPZclv}A&}S?MRy)q3VsT)Ei1YEBas97kh{zW7;j`_S9Z@P$MdY>!@{qV6MF=PExQ zU%CGDAoem6V{GEk|EUcOm<86=#^QYsxySmx7X0tMkO7g|HTvmxj%ilC1XM0Vu(E*4#BIuZmp-MAI6|YbF%7t;(U2NlV))GDREHu;$6Yx zVSae8Pt9qS)rmoVUn59~E1wzc^-MFH|2W?ef7rX;jdCue@uS(Y+wGN@sdHh?5VdDER4rV3fD-eW=t0tfdou?9Ne&S((Um z+VaDIK^EO?V^Uy4xckYASa>&khqtg@cqbZmZ88-&*Lha^V%=tw-4dH?f%Kp%lzq{0 zdZ2=bf`~X%_X*+6n$0Kc1Lx%7tdf4io};R1-};VDuQat=FMiRJ{~T^Mp68FWr69bK zM>6prYwwjfeOB%E)cWo1R}DY+-QV2ONz=Srm@VeR$s3v|r(RBG&koxEFkw+hXA$=CWd(wT$u}CXmbAHkW756pCjm8!}L@+cOmGo6v8XI?JB@hQ@q4 zZPusDoKx{Iwca!I%=9vmNs3_4BH54tzwYu;q(pd14xa(*n-E0?RoXm|tImc`rIQ>k zY3H2h!($Q(mhR zZGh`S_rNxw#>45xb~Ib~Tn? zololNj_FCNnw=URcZQ9#lVBnOghUQy?%X*N!T)5|BcQKwdw%%TjiN|;>QzBu$WIs)_KQ-Qv~5ldgM zm*Z6_9}f*+R4?TI7%E*H;ka+Wmv7jMnM0e4ZTWfKo&GIN3*`qDmn;_^HuMb7F0N$R zIlM?bBzkIo-FTKMR5LLm<~;aYKaeMmbIhaV$Kky)!{-;_qVKTW9u=}BFum{ zUAp+%O)dUO8}q#ZyoclVpOr&=I)47{j;(F`hj6DB3$6EC&+-hx!7f957ACBF3MmN} zDa%y6=I~_x2w^Ft9g!TZ;QuN}eDizOpcXPi8Y)3aL!#%0L zeLw7SDS-05nf#o7R#{D^olncO38flRU~lq1(U{L=UJHD6vDt(3nUD()V>4wmkJDZ{3YsdGL%`YTfm z89O95y&}a21wz|-9!)#Z^Exa=vq=-H0@f2?@hq(vVWUEiyaHTp)8)&S@b+4chhCj< z)dP`yW($*#F5P$On$wn}r8*QA*;hG@*2N-&i7@)jOnYD>HH|JxNtpj<8*E<~(+a`- zEU=kc^}24XV-2SFzF&(i>z5hKuH};Gv@n6>2s$TuK7Dzsv9z%3zISjYItZ-gWv$qG zogzA?bZ7UDXc|01FierqW!6+e$-n2L-*$|7kPQJ{Ms{swkzLAVFR@piWdyiEW{oRY z_eTqq;k;DO9MfgX$O*T5ly<`odKeYe%y`}A>|;K=Zh7~^{qvdz3ZEXroBer8a0@Ka z-3sqpa1zR{?#I5~l?2Pxg2*awy=e=dJ5Gjzo#*Sok1vEY@6Zf8D^dtD9Zw)1O!AcY zr!%7z+P4PPV-d9?ROPX|Q#n52(r|bRlRwFh_wr+EJ5J4r>P_$-@~oTKVC^YJ5ZLb* zAbh1l>z;kT`nfOm9ZDe(=ir4@HfY~*K0v7rMDpzRoc7s&IyBJL=2VeaNx@tYy?WNF z>$$az_gVnQAN$m*u1YoU*KC98o$`Fag<^1a2PC`KfH~UJ`MPp#+$E4-KO3ekT~u(# zK^~RQnu^+ger_l6(>yGr;Zdsms8%3|O|BNMTYZ{o0({VU2$-CBw*7v0Li5AQ^&6bx z@si9O@h*6Gn=PzP0XN#QI3At1-@>(TDv`~x*k?L-Ua&JMsbTqaaK(5xD0^nKvbamq^PLjW< zooJLNvzC>IOiSy@>Fx6|Xxs?k^ZlfMTSXXu>?ulkXL#2Hkv&1m)b&@@qvF>`9kNPC z&g0yY9E7;$Y6=xQC*~P;+U1oi#XUacGI)?p9x9`3bFUP}3rdUWIv{j3R2B$&XXF?V z+1rcSl-J)X(UiN(gptosWPgQxgo5rWWZ=k*O5Vh1Vh^{AHXi!!T>^q+HDe_T_;V*+ z5(irS=(l%-QnFr@ozZ9E7isJXd!}eVqi`Z94nsF%{MlhjAZ{Z{`QeHSWwyQ*+;j&Q zO$R~!`(u|K*F!w``*FkiZJ$H>eKdBnbZ}>5{cB&C*5&luI42f7`n8B1?khzMm*q7s z^dp4UN3>N;m^i7z0pNOtYYGy9udop22C1#s1z&l4d=369`UhLRrA`RhcA8|{nN*3! zMP|}>(eq;O!RC@pddwnXtOQmaeHOS??&aDs1}lXX!eBNPapw@AfTF8}t*inU>ecjo zFz3T9@;j*md8$l(LZ5|$UtT+MbET9zxOq~O3m-`;f=R~jQx;Bu=9H~|`p1v1HX4XY z8|E|#u4b*j-i1w~od*H_eW2%-=lx|60KoC@8iV$)`tp~7!OYp&{_k!{I!Jz43_Hr0 zW(q1tug-+S37d_ak@0)gWGp{lHal0_snKX8>wDV{BQah^A92GNHgmf`Bszr8A*vf5 z@A%&cW&)0mX5TB+PDf?r&+u4F_)~MzHuf~$Q|)M=P2xvfM0{|ybEx4lAYm#AO#&cW zJGFfvaOam2r=^S21$|+`n-6hTMP#ZR5|B`MyI+`JlSo9du<;T~3*;h4l?f&Grnr)g zrb+4%79gG#ijZAKJK?~_W6I`+z#p| zq1A?)l&KogycpIbVP64BUOsWI1uJf;bRT8YRHurlQiVr81-$(f=sVdI^%NYZ`KU+s zQ4jYMr7lDSJ-JTnLhF*_msiV!av9ukJ4X+njmoac)r_UAk+5=cjKy8L{FgrrDG-*U z-~US7y5IMc@L%`yU%C6g@9N)qJetmrI>e4H1vGmEAXA4zVld{l(&IHvSzugK&XT8r z%}e03=xtOP&yo)wj5$OKTvay&6$~%s60Djuz9g+(LdbgCU^f)V5IGa#CG6r$A{m|3 z*vvT;f_#6c^g^p7i3fqlJ+UOZk%2uZdV37>TS-Br-N21 zvy>-;Wi=}if&!9dtZI9&Y7zVa2ni=v^;(8v*H$dgaf`oZ`&V<(o_+z?_*z)8!|TB# zWZ#*T?BDY^si|t2?spzr|NcYumy=Up(%H$w(#gYE!`H>q-SDqmp3a#4%kes9Tyg4Y z#|gU|vTPW_bUug_v20j&SZwC(;hYS1N*60LW5n#?wsQy;9WPEh0E+-<8{VPbw$dV^ zeK1oC*Q5^sjHiB)sf!8TlZMsgwu5rxDBcDQ2|~&ccoLr2Jwj)$6UrC;cD7v@7D=<` z&?ZZojek+c37de+kN;Fa zqfeE3538D>P;fG*oyl5qH@fT=JBTixsRNbr&J4XUF+G+JdHBJKb0C`l%I#3#Ddb!y z0^};A(0$6>g#LbhPeuqs*YD=B#JwltCfkAZGCEo567EY-uE-vcwD^wg+}xEWaKlKB z%=>M1yys!s*!a~6N6XfGAM`8GFc4Bz0Rj>m>c5+ze+T#PSIF;Z|NqwLKhb~skpG1R z074*!|2O)7T*-gJ|1{|S13&rw^Z&uF`zOJl2Ce@`5XuPuH^G0jYyHXc=W5nJERw&I z?e}H;$@2Hw)}JhYwy6JMX~p}GEPpqw|77{IZSW6^73qIu`MZhmC(EDn%Kyg#5l{U$ z%RjTsKcRnW<3CVH`hQc(KY@R0%|F1i-@yMH#s5*BKf!+%wtv7qjDLgwOPTwV=g&g% f4^Ioze=HlS3NXKy6#xL_-*5EaRTYWlue1LHB-XGs literal 0 HcmV?d00001 diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpOutHandoverViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpOutHandoverViewModel.kt index 51e3efe..40e57ba 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpOutHandoverViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/IntExpOutHandoverViewModel.kt @@ -219,7 +219,9 @@ class IntExpOutHandoverViewModel : BasePageViewModel() { "fdest" to fdest.value?.ifEmpty { null }, "uld" to uldNo.value?.ifEmpty { null }, // 以下两项为手机版新增筛选维度,平板端保持空值故不参与查询 - "hoState" to handoverState.value?.ifEmpty { null }, + // 参数名以 api-doc 为准:交接状态为 handoverState(integer,0 未交接 / 1 已交接)。 + // hoId(交接人)后端查询入参暂不支持,已记录到 documents/后端接口对接问题清单.xlsx + "handoverState" to handoverState.value?.ifEmpty { null }, "hoId" to hoId.value?.ifEmpty { null } ) @@ -255,12 +257,12 @@ class IntExpOutHandoverViewModel : BasePageViewModel() { /** * 加载「待交接 / 已交接」Tab 角标数量。 * - * 复用统计接口,分别以 hoState=0 / 1 各查一次,且沿用当前其余筛选条件, + * 复用统计接口,分别以 handoverState=0 / 1 各查一次,且沿用当前其余筛选条件, * 保证角标与列表口径一致。仅手机版调用。 */ private fun loadTabCounts(filterParams: Map) { listOf("0", "1").forEachIndexed { index, state -> - val params = (filterParams + mapOf("hoState" to state)).toRequestBody() + val params = (filterParams + mapOf("handoverState" to state)).toRequestBody() launchCollect({ NetApply.api.getIntExpOutHandoverTotal(params) }) { onSuccess = { result -> val count = (result.data?.wbNumber ?: 0).toString()