front/.cursor/skills/oms-auto-trigger-formula/SKILL.md
zzh 17c4380c1b
All checks were successful
Build and Deploy Front / deploy (push) Successful in 6m51s
feat: 官网代理招募入口,并修复代理登录回官网与触发状态中文
代理卡与权益区并排展示;权限守卫放行官网;返佣触发状态走订单状态 i18n;顺带更新自动触发公式 skill。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-30 12:31:36 +08:00

149 lines
6.6 KiB
Markdown
Raw 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-auto-trigger-formula
description: >-
Writes OMS auto-trigger (自动触发) Chinese formulas for /channel/autoTrigger.
Use when the user asks for 触发条件, 自动触发公式, 拦截/警告/问题件规则,
oversize/国家/客户/销售产品条件, 字段非空/为空/不能为null 必填校验,
or formula verification sample data.
---
# OMS 自动触发公式编写
为 `/channel/autoTrigger` 生成可直接粘贴的**中文公式**(后端 `ChineseFormulaEvaluator`)。
源码权威:
- 前端字段/算子:`src/views/channel/autoTrigger/formulaMeta.ts`
- 后端解析:`Oms.Application/.../ChineseFormulaEvaluator.cs`、`AutoTriggerFormulaMeta.cs`
## 产出格式
回复必须包含:
1. **时机**:`下单` | `入库` | `出库`(无「预报」;旧「预报」=「下单」)
2. **操作**:`拦截` | `警告` | `问题件`
3. **公式**:单行可执行表达式(无解释性注释夹在公式内)
4. **一句话说明**:命中条件是什么
5. (可选)**验证样例**:国家/尺寸/客户等,方便弹窗「验证触发条件」
```text
时机:下单
操作:拦截
公式:(单件最大长度()>60||单件最大宽度()>46)&&国家包含('GB')
说明:英国且超尺寸时拦截
验证样例:国家 GB,长 70,宽 40,高 40
```
## 语法硬规则(必遵守)
| 规则 | 正确 | 错误 |
|------|------|------|
| 字段名必须是注册过的**中文 label** | `国家包含('GB')` | `ConsigneeCountry=='GB'` |
| 字符串字段用 `字段包含('值')` | `客户包含('阿里')` | `客户()=='阿里'` |
| 数值/聚合用 `字段()` 再比较 | `实重()>5`、`单件最大长度()>60` | `实重>5`、`长度包含('60')` |
| 布尔用 `字段()==1` / `==0` | `是否偏远()==1` | `是否偏远()==true` |
| **非空 / 不能为 null** | `国家有值()` 或 `国家包含('')` | `国家!=null`、`国家()==null`、`国家!=''` |
| **为空 / 未填** | `收件人邮编为空()` 或 `!收件人邮编有值()` | `邮编==null`、`邮编包含(null)` |
| 字符串字面量单引号 | `'GB'`;内部单引号翻倍 `''` | `"GB"` |
| 逻辑运算 | `&&` `\|\|` `!` | `and` `or` `not` / 中文「且」 |
| 比较运算 | `==` `!=` `>` `>=` `<` `<=` | `=` `<>` |
| 算术 | `+ - * /` 与 `()` | — |
| 空公式 | 空串视为恒真(勿故意输出空) | — |
| 长度 | ≤ 10000 | — |
`包含` 语义:字段字符串 **Contains** 参数(子串匹配,非全等)。多选可用 `\|\|`:
```text
国家包含('GB')||国家包含('UK')
```
排除产品:
```text
!销售产品包含('EX_ASP_HKDHL_YD')
```
### 空值 / 必填(不能为 null)
求值器**没有** `null` 字面量;禁止写 `字段==null` / `字段()!=null`。
| 意图 | 推荐写法 | 等价写法 |
|------|----------|----------|
| 字段有值(非 null、字符串非空白) | `国家有值()` | `国家包含('')` |
| 字段为空(null 或空白) | `国家为空()` | `!国家有值()` |
| 拦截「缺某字段」 | `收件人电话为空()` | `!收件人电话有值()` |
| 拦截「某字段必须填」再叠加条件 | `国家有值()&&国家包含('GB')` | — |
语义说明:
- **字符串 / 日期**:`有值` = 非 null 且非空白;`为空` = null 或空白。
- **数值 / 布尔**:`有值` = 底层值非 null(`0` / `false` 仍算有值);`为空` = null。
- 件重尺若业务上「0 也算未填」,用 `单件最大长度()<=0` 等比较,**不要**只靠 `有值()`(因为 0 仍有值)。
- `字段()` 把 null 当成 `0`,**不能**用 `字段()==0` 区分「未填」与「真是 0」。
## 写公式工作流
1. 从用户描述抽出:时机、操作、条件(国家/客户/产品/尺寸/重量/状态、**必填/不能为空**等)。
2. 映射到**中文字段**(见下方常用表;完整目录见 [field-catalog.md](field-catalog.md))。
3. 按字段类型选:`包含('值')` / `字段()` / **`有值()` / `为空()`**。
4. 用户说「不能为空 / 必填 / 未填拦截」→ 用 `字段为空()`(缺了就命中)或前置 `字段有值()&&…`。
5. 用 `&&` / `||` / `!` / `()` 组合;复杂条件先括号。
6. 对照 [examples.md](examples.md) 自检语法。
7. 输出「时机 + 操作 + 公式 + 说明」;需要时给验证样例。
不确定字段名时:优先读 `formulaMeta.ts` 的 `ORDER_TABLE_FIELDS` / `VIRTUAL_FORMULA_FIELDS`,或后端 `AutoTriggerFormulaMeta`。**禁止编造未注册中文名**。
## 常用字段速查
### 聚合(下单尺寸最常用)
| 中文 | 用法 |
|------|------|
| 单件最大长度 / 宽度 / 高度 | `单件最大长度()>60` |
| 单件长宽高之和 | `单件长宽高之和()>150` |
### 订单 / 客户
| 中文 | 类型 | 典型 |
|------|------|------|
| 国家 | string | `国家包含('GB')`(二字码) |
| 收件国家名称 | string | `收件国家名称包含('英国')` |
| 销售产品 | string | `销售产品包含('EX_')` |
| 收货渠道 | string | `收货渠道包含('DHL')` |
| 客户 | string | `客户包含('阿里国际站')` |
| 客户组 | string | `客户组包含('VIP')` |
| 货物属性 | string | `货物属性包含('sensitive')` |
| 申报总金额 | number | `申报总金额()>1000` |
| 是否偏远 / 是否COD / 是否拦截 | boolean | `是否偏远()==1` |
| 实重 / 计费重 / 长度/宽度/高度 | number | `实重()>20`(件重尺;下单前优先用聚合字段) |
### 收件人(选填 / 必填场景)
`收件人邮编包含('9')`、`收件人省州包含('CA')`、`收件人城市包含('London')`
必填拦截示例:`收件人手机为空()||收件人电话为空()`、`收件人邮编为空()`(手机=`收件人手机`,固话=`收件人电话`)
完整字段见 [field-catalog.md](field-catalog.md)。
## 时机与操作注意
- **下单 + 拦截**:建单前阻断(含草稿保存尝试)。
- **下单 + 警告/问题件**:预报成功后触发;纯草稿保存不触发。
- **入库/出库**:作业创建**之后**触发;「拦截」只打标,不回滚入库/出库。
- **问题件**:需能匹配问题模板,否则可能静默跳过。
## 自检清单
- [ ] 每个字段都是注册中文名
- [ ] 字符串用 `包含('…')`,数字用 `字段() 比较`
- [ ] 必填/非空用 `有值()` 或 `包含('')`,为空用 `为空()`;无 `null` 字面量
- [ ] 括号匹配;`&&`/`||` 优先级按需加括号
- [ ] 国家一般用二字码 `国家包含('XX')`
- [ ] 排除条件用 `!字段包含('…')`
- [ ] 公式可单行粘贴进触发条件编辑器
## 更多
- 完整字段目录:[field-catalog.md](field-catalog.md)
- 场景示例:[examples.md](examples.md)