You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
7.0 KiB

16 hours ago
# 10 · demo/index.html 同步到返工后契约
- **Status:** resolved
- **Type:** task
- **Blocked by:** —(纯机械改,可随时开工)
- **来源**: 2026-09-05 客户模块验收返工(`.scratch/customer-rework/map.md`,已收官)会话审计发现;用户拍板「开票挂账,暂不改」
## 背景
`demo/index.html`(票 07 产出,2026-09-04 19:16)的 API 层整体停在**返工前旧契约**。返工票 02 已把客户域全量重塑为扁平动作动词(POST 表单 + 查询参数,零 PUT/DELETE/@PathVariable),demo 对现行后端基本全数 404/405。
## 现状盘点(2026-09-05 枚举,36 处 api() 调用,~20 处需改)
旧契约 → 新契约对照(权威基准 = `.scratch/customer-module/API-SUMMARY.md`,73 端点对账零差异):
| demo 现调用(旧) | 应改为(新) |
|---|---|
| `POST /api/customer/workspace/{ws}/page`、`/{ws}/board/summary` | `POST /api/customer/workspace/page`、`/board/summary`(`workspace=mine/overview/pool` 改为**表单字段**) |
| `POST /api/customer`(新建) | `POST /api/customer/create` |
| `PUT /api/customer/{id}`(编辑) | `POST /api/customer/edit?id=`(**必带 version + isBizNegotiated + isChild**,冒烟实证) |
| `GET /api/customer/{id}`(详情/页签 1) | `GET /api/customer/detail?id=` |
| `GET /{id}/detail-head` | `GET /api/customer/detail-head?id=` |
| `GET /{id}/contacts` | `GET /api/customer/contacts?customerId=` |
| `GET /{id}/follow/page` | `GET /api/customer/follow/page?id=` |
| `POST /{id}/follow` | `POST /api/customer/follow/add?id=` |
| `GET /{id}/opportunities` | `GET /api/customer/opportunity/page?id=` |
| `GET /{id}/members` | `GET /api/customer/member/list?id=` |
| `POST /{id}/members` | `POST /api/customer/member/add?id=` + `MemberAddDTO{memberUserIds[]}` 数组表单 |
| `DELETE /{id}/members/{uid}` | `POST /api/customer/member/remove?id=&memberUserId=` |
| `GET /{id}/oplog/page` | `GET /api/customer/oplog/page?id=` |
| `POST /api/customer/contact/{cid}`(编辑)/ `DELETE /contact/{cid}` | `POST /api/customer/contact/edit?id=` / `POST /api/customer/contact/delete?id=`(必填 name/jobTitleName/phone) |
| `POST /api/customer/import/{taskId}/confirm` | `POST /api/customer/import/confirm?taskId=` |
| `GET /api/customer/import/{taskId}` | `GET /api/customer/import/result?taskId=` |
| `GET /api/customer/import/{taskId}/failures` | `GET /api/customer/import/failures?taskId=` |
| `GET /api/customer/transfer/{id}` | `GET /api/customer/transfer/detail?id=` |
| `POST /transfer/{tid}/assign?...` | `POST /api/customer/transfer/assign?id=&customerIds=&assignUserId=` |
| `GET /transfer/{tid}/assignable` | `GET /api/customer/transfer/assignable?id=`(**D-07 稳定超时**,演示按缺陷模式处理) |
| `PUT /api/rule/customer/reminder`(JSON) | `POST /api/rule/customer/reminder/save`(表单:masterEnabled/firstTriggerEnabled/firstTriggerDays/secondIntervalEnabled/secondIntervalDays) |
无需动的调用:check-name / check-credit-code / contact/check-phone / import upload/page/template / transfer preview/initiate/page / `GET /api/rule/customer/reminder`(新旧契约同形)。
## 改造说明
- 改动范围限 `demo/index.html` 的 fetch 层(api 调用 URL + method + 表单字段名),页面结构/交互不动。
- 全部新契约以 API-SUMMARY.md 对应节为准(workspace §2.1、客户 §2.3、详情 §2.5、成员 §2.8、联系人 §2.7、导入 §2.12、交割 §2.11、提醒规则 §2.13)。
- demo 不补新能力页签(战略协议/view-form/focus/claim 等 demo 本就没有,超出本票范围)。
## 验收
- [ ] grep 复核:`PUT|DELETE|/api/customer/\{` 及 `/{id}|/{taskId}|/{cid}|/{tid}` 拼接风格调用零残留;
- [ ] 逐调用与 API-SUMMARY.md 端点表对得上(可复用 `.scratch/customer-rework/dump_api_out.txt` 作基准);
- [ ] 服务起(verify profile,环境见本图环境事实段)后 demo 主流程可点通:列表/新建/编辑/详情页签/成员/导入/交割预览;
- [ ] `deploy\demo\index.html` 为线索模块 demo(无客户端点),本票**不涉及**。
## Comments
## Answer(2026-09-05 落地收官)
**改动**(全部在 `demo/index.html`,页面结构/交互未动):
1. **对照表 21 处 api() 全改新契约**:workspace×2(`workspace` 转表单字段)、create、detail、edit(`POST edit?id=` 必带 `version+isBizNegotiated+isChild`,值取自 detail 回显存 `window._editBiz/_editChild`)、detail-head、详情页签×6(contacts 用 `customerId=`、follow/opportunity/oplog 带 `id=&current=&size=`)、contact edit/create/delete、follow/add、member add/remove(数组表单原样保留)、import confirm/result/failures(`?taskId=`)、transfer detail/assign/assignable(`?id=`)、reminder save(PUT JSON → POST 表单五字段)。
2. **对照表未列、实测同批修正 3 处**(否则点不通):
- **focus 族扁平化**:票 08 时代加的 `PATH_OP` 路径变量特例(`POST /{id}/focus`)返工后已变 `POST /api/customer/focus?id=`(§2.9 权威),oneBy 简化为全 flat `?id=`
- **create 返回形状**:`POST /api/customer/create` 返回 `CustomerSaveResultDTO`(非裸 id),toast 改取 `d.id`(BaseDTO)回退 `customerNo`
- **成员行渲染**:`CustomerMemberDTO` 字段 `roleType`→`role`(`OWNER`/`COLLABORATOR`),旧判定失效导致 owner 行也渲染「移除」按钮,已修 `isOwner()`
3. **3 处 UI 文案勘误**(PUT 字样随契约消失:「PUT 为全量覆盖」→「保存为全量覆盖」等),不改结构。
**验收逐项**:
- [x] grep 复核:`PUT|DELETE|PATH_OP` = 0 命中;`+ <idVar> + '/` 路径变量拼接 = 0 命中;
- [x] 逐调用对账:36 处调用(24 行)逐一命中 `dump_api_out.txt`(73 端点基准),另 2 处 auth 调用不在客户域范围;
- [x] 起服实测(verify profile,fat jar 全量重建 67s):`demo_smoke10.py` Playwright chromium headless **11 步全 PASS**——登录/列表/汇总卡/新建(含 L2 相似命中 confirmSimilar 确认流实测)/编辑 CAS/详情五页签/联系人 rows=3/成员加+移除/导入预检(taskId=751484670884970496,suspect=1 疑似判定正常)/交割列表 5 单+预览 48 行/网络层零旧契约形态(`/api/customer/<digits>/` 与 PUT/DELETE 均 0);**console_errors=0、page_errors=0**;结果 `demo-smoke10-result.json`、截图 `shots10/`×7;
- [x] `deploy\demo\index.html` 为线索模块 demo,未触碰。
**实测数据与痕迹**:
- 测试新建客户 6 个(含 crashed 轮次)全部**正门清理归档**(`archive` 批量,见脚本 cleanup 段);成员测试在 e2c-成员-样例 上加/移除曾偲青后复原;导入预检留 1 条 DRAFT 任务(无业务写入,无污染)。
- 测试基建:`.scratch/customer-e2e/.venv10`(py3.13 venv,playwright 版本恰配本机已缓存 chromium-1234,零浏览器下载)保留复用;8080 服务验证完已停(pid 17532)。
- 无新缺陷、无新 fog;U/W 观察点无变化。