feat: 整站全量采集与订单写入接口契约补全

- GET 全量扫描 279 个接口并留档(HTTP200=90, 业务成功=76)
- POST 安全探测 24 个只读/计算接口(白名单制, 支付/短信/删除类零触碰)
- 订单写入接口契约经 chunk 源码静态分析补全:
  orders CRUD / 创建订单{contract_id,drawing_data,pic_url} / windoor_default 保存
- 确认付费墙语义 code=10086 及到期/角色权限响应
- doc/API.md 新增整站采集结果章节, 更新订单模块契约表
This commit is contained in:
HHY
2026-09-20 07:19:10 -07:00
parent 0d94fa2f29
commit 7554f2e3c7
293 changed files with 2511 additions and 6 deletions
+60 -6
View File
@@ -11,8 +11,9 @@
```
- `code=1` 成功,其他为失败;`message` 为用户可读文案。
- **`code=10086` 业务付费墙**:模块未购买/已到期,`message` 为"购买后解锁此功能,点击此处去购买";前端跳转商城。自研系统对应"套餐权限校验中间件"。
- 列表分页:`data: { current_page, data: [], total, per_page, last_page, next_page_url, ... }`。
- 业务错误:HTTP 200 + code≠1;认证失败:HTTP 401。
- 业务错误:HTTP 200 + code≠1;认证失败:HTTP 401;参数缺失:HTTP 200 + code=0(message 提示)或 422。
## 1. 认证模块
@@ -67,13 +68,26 @@
|---|---|---|---|---|
| 合同列表 | GET | `/api/contracts` | — | ✅ `{"contracts":{current_page,data:[{id,contract_no:"FG20260818009",customer,area,count,money,status:"意向单",cut_status,sign_status,contract_type,confirmed,discount,oids[],agency_money}]}}` |
| 意向单转合同 | POST | `/api/convert-contract/` | `{contract_id,...}` | ⏳ |
| 订单列表/搜索 | POST | `/api/orders/` | 搜索条件 JSON | ⏳(只读采集未探测 POST) |
| 订单详情 | GET | `/api/order-by-pid` | `pid` | ⏳ |
| 订单进度 | GET | `/api/get_order_process(_list)` | `order_id` | ⏳ |
| **订单列表/搜索** | POST | `/api/orders/` | `{page:1, ...筛选条件}` | ✅ 已验证(付费墙):`{"code":"10086","message":"购买后解锁此功能,点击此处去购买","data":""}`;已购账号返回 Laravel 分页订单列表 |
| **创建订单(合同+图纸)** | POST | `/api/orders/` | ✅ 源码确认:`{contract_id, drawing_data(shapeManager序列化), pic_url(缩略图)}` | ⏳ |
| 订单详情 | GET | `/api/orders/{id}` | 路径 `id` | ✅ 路由确认(源码),返回 `data.order` |
| 订单排序 | PUT | `/api/orders/{id}` | `{sort:n}` | ✅ 路由确认(源码) |
| 删除订单 | DELETE | `/api/orders/{id}` | 路径 `id`(支持批量 Promise.allSettled) | ✅ 路由确认(源码) |
| 订单详情(按pid) | POST | `/api/order-by-pid` | `{pid}` | ✅ 已验证(付费墙 code=10086) |
| 订单进度 | POST | `/api/get_order_process` | `{order_id}` | ✅ 已验证 code=1 |
| 订单进度列表 | GET | `/api/get_order_process(_list)` | — | ✅ GET code=1 |
| 订单日志 | GET | `/api/order_up_logs` | `订单id`(缺失时提示"订单id 必须") | ✅ 参数契约确认 |
| 阳光房订单 | POST | `/api/sunny_house_order/` | `{page:1,...}` | ✅ 已验证(付费墙 code=10086) |
| 售后单 | POST | `/api/after_sales_orders/` | `{问题描述...}` | ✅ 已验证(校验"请填写问题描述") |
| 重复订单校验 | POST | `/api/is-repeat-order` | 查询条件 | ✅ 已验证 code=1 |
| 订单状态(管家婆) | POST | `/api/cj-orders-status` | 需参数(当前500) | ⏳ |
| 合同确认 | POST | `/api/up-contract-confirmed/` | `{contract_id}` | ⏳ |
| 电子签名上传 | POST | `/api/update-contract-sign-status` | `{contract_id, sign_picture}` | ⏳ |
| 收款记录 | GET | `/api/contract_receipt_list/` | `contract_id` | ⏳ |
| 收款统计 | GET | `/api/contract_receipt_statistics(_tb)` | `date_range` | ⏳ |
| 收款记录 | GET | `/api/contract_receipt_list/` | `contract_id` | ✅ GET code=1 |
| 收款统计 | GET | `/api/contract_receipt_statistics` | — | ✅ GET code=1 |
| 收款统计(按年) | GET | `/api/contract_receipt_statistics_tb` | `年份`(缺失提示"请选择年份") | ✅ 参数契约确认 |
**订单写入流完整契约(自研对齐)**:`画图(shapeManager.serialize) → POST windoor_default 保存模板 或 POST orders/{contract_id, drawing_data, pic_url} 创建订单 → GET orders/{id} 详情回显 → PUT orders/{id} 排序 → DELETE orders/{id} 删除`
## 6. 产品/价格模块
@@ -128,3 +142,43 @@
| 反馈 | POST | `/api/feedback` | `{content}` | ⏳ |
> 标注说明:✅ = 已用只读请求实测并留存样本于 `data/api-samples/`;⏳ = 写入/低频接口未对生产系统探测,自研时按功能语义实现,或抓包后补全。
## 11. 整站全量采集结果(2026-09-20)
原始留档:`data/full-site/`(`get/` 279 个接口响应、`post/` 24 个 POST 响应、`get-manifest.json`、`post-manifest.json`、采集脚本 `sweep_get.py`/`sweep_post.py`)。
### 11.1 GET 扫描(279 个接口)
| 结果 | 数量 | 说明 |
|---|---|---|
| HTTP 200 | 90 | 其中 code=1 业务成功 **76 个** |
| HTTP 405 | 110 | POST/PUT/DELETE-only 接口(已列入 ⏳ 并按语义实现) |
| HTTP 404 | 65 | 需路径参数(如 `{id}` 后缀类) |
| HTTP 500 | 14 | 缺必填参数触发(服务端未做输入校验,自研须避免) |
参数契约(由失败提示反推):`order_up_logs`←订单id;`script/`←系列id;`pay-page`←类型;`contract_receipt_statistics_tb`←年份;`ywy-ykt-user`←手机号;`three-d-data`(POST)←order_id。
### 11.2 POST 安全探测(24 个,白名单制)
- 付费墙确认(code=10086):`orders/`、`sunny_house_order/`、`order-by-pid`、`offer-price(/)`、`product_by_warehouse`、`order_format_by_warehouse`、`ai_product`
- 成功(code=1):`get_order_process`、`is-repeat-order`、`xf_contract_workshop`
- 参数提示:`three-d-data`←必须 order_id;`after_sales_orders/`←问题描述
- 未探测(危险类,永不盲发):支付(wechat_pay*、withdraw)、短信(send-bind-code、verification-code-new)、账号绑定(bind-*、login)、删除/更新类(del_*、void_*、up_*、*_sort)、文件上传(upload*)
### 11.3 源码静态提取的写入契约
| 流程 | 方法+路径 | 请求体 |
|---|---|---|
| 创建订单 | POST `orders/` | `{contract_id, drawing_data, pic_url}` |
| 保存官方模板 | POST `windoor_default` | `{drawing_data: shapeManager.serialize(true), ...}` |
| 修改系列脚本 | PUT `script/{id}` | `{drawing_data: shapeManager.serialize(...)}` |
| 模板排序 | POST `windoor_template_sort` | `{[模板id]: 序号, ...}` |
| 删除订单 | DELETE `orders/{id}` | 路径参数,前端支持批量 |
| 订单排序 | PUT `orders/{id}` | `{sort}` |
### 11.4 权限/付费墙语义(自研须实现)
- 试账户可用模块:样板库、客户、合同、仓库、收款账户、公告、报表统计、帮助文档
- 付费墙模块(code=10086):订单全流程、报价(offer-price)、产品库、订单打印模板、AI 产品
- 到期语义:`pay-page-list` 返回 code=0 "您的账号已经到期,请联系销售人员!";`try_render` 返回 "体验版无法体验实景渲染"
- 角色权限:`contract-stat` 返回 code=210 "该账号没有该权限"