1
0
forked from erp-dev/erp

feat: hpname and external_order_id + product_name unique together

This commit is contained in:
2026-03-23 19:06:11 +08:00
parent b58667ca52
commit eb5fae1ce7
6 changed files with 251 additions and 10 deletions

View File

@@ -26,7 +26,7 @@
1.`BianHaoID` 对本次拉到的 records 分组
2. 每个分组 upsert 一条 `PrintingOrder`
3. 分组内每条 record 按 `ID` upsert 一条 `PrintingJob`
3. 分组内每条 record 按 `BianHaoID + YanSe` 覆盖 upsert 一条 `PrintingJob`
4. 仅当本地全部写入成功后,才推进外部 cursor
## 字段映射
@@ -39,25 +39,27 @@
| `customer.KhName` | 客户名 | `PrintingOrder.customer` | 按本商户 `Customer.name` 精确匹配,取第一条 |
| `KhID` | 外部客户 ID | `PrintingOrder.external_customer_id` | 原样保存 |
| `customer.KhName` | 外部客户名 | `PrintingOrder.external_customer_name` | 原样保存 |
| `HpName` | 布料名 | `PrintingOrder.fabric` | 原样保存到订单面料字段 |
| `CaoZY` | 外部操作员/业务员 | `PrintingOrder.created_by` / `PrintingOrder.external_employee_name` | 若能匹配到内部员工且员工绑定了系统用户,则 `created_by` 取该用户,`external_employee_name` 置空;否则 `created_by` 取固定同步用户,`external_employee_name` 保留原文 |
| `SHDZ` | 布料来源 + 工艺 | `PrintingOrder.fabric_source` / `PrintingOrder.craft` | 以空白字符 split第 1 段为 `fabric_source`,剩余重新拼接为 `craft` |
| `SeHao` | 幅宽 | `PrintingOrder.width` | 原样保存 |
| `MeoA` | 曲线 | `PrintingOrder.curve` | 原样保存 |
| `FidJ` | 电脑位置 | `PrintingOrder.position` | 取分组首条 record 的原始值 |
| `BeiZhu` | 滚筒注意事项 | `PrintingOrder.rolling_warn` | 原样保存 |
| `KdRiQi` | 下单日期 | `PrintingOrder.outgoing_date` | 按 ISO 时间解析并保存 |
| 分组首条原始数据 | 外部来源快照 | `PrintingOrder.external_raw` | 保存 order 级别的原始数据,便于追溯 |
补充说明:
- 外部没有可靠的 “面料” 字段,因此 `PrintingOrder.fabric` 本次同步固定写空字符串 `""`
- `BianHaoKD``RiQi``FidJ` 等当前未单独属性化的字段,保留在 `external_raw`
- 外部 `HpName` 已作为布料名使用,直接写入 `PrintingOrder.fabric`
- `BianHaoKD``RiQi` 等当前未单独属性化的字段,保留在 `external_raw`
- `BianHaoKD` 当前样例值类似 `"1.27"`,不按日期强解析
### 二、单条 record -> PrintingJob
| 外部字段 | 含义 | 本系统字段 | 规则 |
| --- | --- | --- | --- |
| `ID` | 明细顺序 ID | `PrintingJob.original_id` | 幂等键;原样保存 |
| `ID` | 明细顺序 ID | `PrintingJob.original_id` | 保存最近一次覆盖该任务的外部明细 ID便于追溯 |
| `YanSe` | 外部产品名 | `PrintingJob.product` / `PrintingJob.external_product_name` | 若能按本商户 `Product.name` 精确匹配,直接绑定该产品且不再拉图;若本地不存在,则先创建产品、拉图并上传到 storage成功后绑定该产品 |
| `ShuLiang` | 下单数量 | `PrintingJob.quantity` | 按整数解析;当前预期外部值为整数字符串或 `10.00` 这类可安全转整数的值 |
| `JiJiaDW` | 单位 | `PrintingJob.unit` | 去掉前导 `/` 后保存,例如 `/段` -> `段` |
@@ -66,6 +68,12 @@
| `YanSe` | 外部产品名 | `PrintingJob.description` | 本次不单独映射到 description原始值由 `product.name``external_product_name` / `external_raw` 表达 |
| 单条原始数据 | 外部来源快照 | `PrintingJob.external_raw` | 保存 job 级别完整原始 record |
补充说明:
- `PrintingJob` 的覆盖唯一性按 `PrintingOrder.external_order_id + YanSe` 处理
- 若同一外部订单下再次出现相同 `YanSe`,则更新已有 `PrintingJob`,不再新增
- 更新时 `original_id` 会覆盖为最新外部 record 的 `ID`
## 员工绑定规则
1. 读取外部 `CaoZY`