front/.cursor/skills/oms-receiver-address-parse/SKILL.md
zzh f1d219ae48 feat: ship billing UI for additional services, conditions, and fee insights
Add product/channel billing condition editors, place-order additional services, billing simulator, forecast-to-inbound fee delta and margin warnings, insurance-aware claim tips, OMS preset dict seeds, and related AI skills/system pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-01 18:09:22 +08:00

152 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: oms-receiver-address-parse
description: >-
Parses and roughly validates international logistics recipient addresses for OMS
place-order (PC/H5). Use when working on 收件地址, AI解析, parse-address,
receiver fields, 地址完整性, or /order/receiver/parse-address prompts/UX.
---
# OMS 国际物流收件地址解析
面向**跨境/国际物流下单**:把客户粘贴的整段地址拆成 OMS `receiver.*` 字段,并做**粗校验**(能否预报/打单),不是地图级精校、也不是国内快递四级地址库。
实现入口:
- 后端:`POST /order/receiver/parse-address`(`OrderService.ReceiverAddressParse.cs`)
- PC:`src/views/order/placeOrder/index.vue`(左粘贴 / 右表单)
- H5:`H5PlaceOrderSheet.vue`(收件步「AI解析」弹窗)
- API:`postOrderReceiverParseAddress`(`src/api/order/index.ts`)
改 prompt / 校验规则时,以本 skill 为准,前后端口径保持一致。
## 目标(只做这些)
1. **拆字段**:姓名、电话、国家、邮编、省/州、城市、街道行
2. **粗完整**:下单必填是否齐;建议项是否缺
3. **粗风险**:明显缺国家/邮编/街道、国家二字码说不清、电话不像号码 → `warnings`
4. **不编造**:原文没有的省市区邮编一律留空
## 不要做这些
- 不调用地图/邮政 API 做地址真实性验证
- 不强制「可投递 / 门牌存在 / 邮编与城市严格匹配」
- 不把国内四级联选(省市区街道)当成必须结构
- 不把税号/EORI/VAT 当成解析主目标(可有则填,无则忽略)
## OMS 字段映射
| JSON / API | 表单含义 | 说明 |
|------------|----------|------|
| `recipientsName` | 收件人名称 | 必填 |
| `phone` | 手机 | 必填;优先手机号 |
| `telePhone` | 电话 | 固话 |
| `email` | 邮箱 | 选填 |
| `companyName` | 公司 | 选填 |
| `countryCode` | 国家 | **ISO 二字码大写**(US/GB/DE…)必填 |
| `province` | 省/州 | 建议有(US State、CN 省、AU State) |
| `city` | 城市 | 建议有 |
| `streetNumber` | 门牌号 | 可选;能拆再拆 |
| `streetAddress1` | 地址1 | **必填**主街道行 |
| `streetAddress2/3` | 地址2/3 | 溢出或 Apt/Suite |
| `zipCode` | 邮编 | 必填(粗:非空且像邮编即可) |
## 完整度口径(粗校验)
### 必填(`missingRequired` / `isComplete=false`)
- 收件人名称
- 收件人手机
- 国家(二字码)
- 邮编
- 地址1
与 PC/H5 下单提交校验对齐。
### 建议(`missingRecommended`,不挡 `isComplete`)
- 省/州
- 城市
多数渠道打单会用到;缺了给提示,不拦死。
### warnings(短中文)
适合写:
- 无法判断国家
- 电话疑似不完整
- 邮编格式可疑(如美国非 5/9 位、英国完全不像外邮编)
- 街道与姓名粘在一起拆不清
不要写:
- 「该地址在谷歌地图不存在」
- 「邮编与城市不匹配」(无权威数据时禁止臆断)
## 解析规则(中/英)
1. **国家**:中文名/英文名 → ISO2。常见:中国 CN、美国 US、英国 **GB**(勿用 UK 作主码)、香港 HK、台湾 TW、澳门 MO、德国 DE、法国 FR、日本 JP、澳大利亚 AU、加拿大 CA、新加坡 SG。
2. **中国地址**:省→`province`,市→`city`,区县+路号→`streetAddress1`;勿把省市区塞进姓名。
3. **英文地址**:`State`→`province`,`City`→`city`,street line→`streetAddress*`,ZIP/Postcode→`zipCode`。
4. **电话**:带国家码的 `+1`/`+44` 等保留;手机进 `phone`,固话进 `telePhone`。
5. **过长街道**:主行放 `streetAddress1`,其余 `2/3`;单独门牌可放 `streetNumber`。
6. **不确定就空**:宁可空 + warning,不要猜邮编/城市。
## LLM 输出契约
只输出 JSON(可被后端 `ExtractJsonObject` 抽取):
```json
{
"recipientsName": "",
"companyName": "",
"phone": "",
"telePhone": "",
"email": "",
"countryCode": "",
"province": "",
"city": "",
"streetNumber": "",
"streetAddress1": "",
"streetAddress2": "",
"streetAddress3": "",
"zipCode": "",
"warnings": []
}
```
后端会再跑 `EvaluateCompleteness`,前端展示绿/橙/红提示。
## 改代码时注意
1. 改 system prompt → 同步本 skill + `OrderService.ReceiverAddressParse.cs`
2. 改必填集合 → 同步 PC `isSingleRecipientComplete` / H5 `validateStep(1)` / 后端 `EvaluateCompleteness`
3. UX:解析只**覆盖非空解析结果**;有选填内容时展开「更多」
4. 无 AI 提供商时接口应明确报错,勿静默假成功
## 自测样例
**英:**
```text
John Smith, +1 310-555-0199, 1001 Sunset Blvd, Los Angeles, CA 90001, USA
```
期望:US / CA / Los Angeles / 90001 / street 含 Sunset / phone 有值。
**中(跨境少见但仍要能拆):**
```text
张三 13800138000 广东省深圳市南山区科技园南路 88 号 518000
```
期望:CN / 广东 / 深圳 / 邮编 518000 / 地址1 含南山区或路名。
**故意残缺:**
```text
Tom, Some Street, USA
```
期望:缺 phone/zip → `isComplete=false`,warnings 可提示缺项。