feat(finance): P1 人工商品归一,按内部 SKU 生成 man 商品并回填
- 新服务 manual-product-normalization-service:skuNick → outSkuSn → sku_code 兜底,按内部 SKU 生成 man:<sku> 商品 - 订单项按 id 分批(2 万/批)回填,避免 15s 语句超时;同步补齐人工成本快照的商品维度 - 新增 POST /cost-center/manual-products/normalize(支持 dryRun/日期窗口),成本中心「标准商品」加「归一人工商品」按钮 - 每日 cost_finance_sync 接入最近 N 天的增量归一 - 渠道映射未归一队列增加人工单提示:人工单不能用平台 sku_code 建映射 - 文档同步:P1 标记完成,补充归一接口契约与销售事实重算结果
This commit is contained in:
@@ -112,6 +112,37 @@ AND (
|
||||
)
|
||||
```
|
||||
|
||||
### 4.1 渠道映射诊断与未归一队列
|
||||
|
||||
| 接口 | 说明 |
|
||||
| --- | --- |
|
||||
| `GET /api/v1/admin/cost-center/mappings/diagnostics` | 标准商品数 / 映射数 / 有映射商品数 / 未归一订单项 / 未归一 SKU 组;按 `fulfillment_mode` 拆分聚合 |
|
||||
| `GET /api/v1/admin/cost-center/mappings/unmapped` | 未归一队列,按「来源 + 店铺 + 平台 SKU + 履约方式」聚合,支持 `keyword` / `provider` / `fulfillmentMode` 与分页 |
|
||||
| `POST /api/v1/admin/cost-center/mappings/backfill` | 回填订单项映射;返回 `resolvedExceptionCount`(已归一的 `product_mapping_missing` 异常自动收口) |
|
||||
|
||||
### 4.2 人工商品归一(P1)
|
||||
|
||||
`POST /api/v1/admin/cost-center/manual-products/normalize`,`finance.config`。
|
||||
|
||||
```jsonc
|
||||
// 请求(全部可选;dryRun=true 只预览)
|
||||
{ "dateFrom": "2026-07-10", "dateTo": "2026-10-14", "dryRun": false }
|
||||
// 返回
|
||||
{
|
||||
"distinctSkuCount": 1116, // 待处理的内部 SKU 数
|
||||
"pendingItemCount": 91606, // 待归一的订单项
|
||||
"createdProductCount": 1116, // 新建的 man: 商品
|
||||
"updatedItemCount": 91606, // 回填的订单项
|
||||
"updatedSnapshotCount": 4, // 补了商品维度的成本快照
|
||||
"resolvedExceptionCount": 91606,
|
||||
"remainingItemCount": 0
|
||||
}
|
||||
```
|
||||
|
||||
键的取值:`spec_json->>'skuNick'`(快手)→ `spec_json->>'outSkuSn'`(拼多多)→ `sku_code` 兜底;
|
||||
商品 `canonical_sku = man:<内部SKU>`,`canonical_name` 优先取 `manual_sku_registry.display_name`,否则取订单里最常见的 `sku_name`。
|
||||
每日 `cost_finance_sync` 任务会对最近 N 天执行同一归一(不重复收口异常)。
|
||||
|
||||
## 五、成本版本接口
|
||||
|
||||
路径不变,字段不变:
|
||||
|
||||
@@ -151,17 +151,17 @@
|
||||
| --- | --- | --- |
|
||||
| P0 | 统一履约事实(`fulfillment_mode`)+ 成本模型正交 | **已完成(本地,未部署生产)** |
|
||||
| P0.5 | 人工成本链路收敛为「人工录单 → 扣备用金 → 写快照」(下线登记/审批/报销) | **已完成(本地,未部署生产)** |
|
||||
| P1 | 人工商品归一(`man:<skuId>`)+ 上线后人工成本全覆盖 | 未实施 |
|
||||
| P1 | 人工商品归一(`man:<skuId>`)+ 上线后人工成本全覆盖 | **已完成(本地,未部署生产)** |
|
||||
| P2 | 退款冲减与异常闭环 | 未实施 |
|
||||
| P3 | 影子总账与对账 | 未实施 |
|
||||
|
||||
P0 的具体迁移、回填、代码清单与验收 SQL 见 [成本中心与履约模型](成本中心与履约模型.md);接口契约见 [成本中心API契约](成本中心API契约.md)。
|
||||
|
||||
> 下一步只做 P1,不要同时改退款或总账。
|
||||
> 下一步只做 P2,不要同时改总账。
|
||||
|
||||
---
|
||||
|
||||
## 七、当前实施进度(2026-10-23)
|
||||
## 七、当前实施进度(2026-10-24 更新)
|
||||
|
||||
| 能力 | 状态 | 证据 |
|
||||
| --- | --- | --- |
|
||||
@@ -176,12 +176,13 @@ P0 的具体迁移、回填、代码清单与验收 SQL 见 [成本中心与履
|
||||
| 成本模型与履约方式正交(去 `carrier_type`) | **已实施(本地库已改造)** | 迁移 `103–107` 重写;`cost_items.cost_model` |
|
||||
| 12 个迁移合并为 5 个 | **已实施** | `103_product_catalog` ~ `107_order_item_fulfillment_mode` |
|
||||
| 人工成本链路收敛为「人工录单 → 扣备用金 → 写快照」 | **已实施(本地库已改造)** | 迁移 `108_drop_manual_expense_records`;下线登记单与审批报销 |
|
||||
| 人工商品归一 `man:<skuId>` | **未实施** | P1 |
|
||||
| 人工商品归一 `man:<skuId>` | **已实施(本地库已归一)** | `manual-product-normalization-service` + `POST /cost-center/manual-products/normalize`;1,116 个 `man:` 商品、91,606 个人工订单项归一,人工未归一 = 0 |
|
||||
| 人工商品归一后的销售事实 | **已实施** | 94 天分 30 天窗口重算:26,507 行;人工 ¥1,219.20 万收入全部按 `man:` 商品归集 |
|
||||
| 退款冲减、异常闭环 | **未实施** | §六 P2 |
|
||||
| 影子总账、对账、关账 | **未实施** | §六 P3 |
|
||||
|
||||
> 分支事实:以上实现已快进合并到 `dev`(tip `43f402cf`);迁移 `103–109` **未推送远端、未部署生产**。
|
||||
> 生产口径仍以 `main` 为准。
|
||||
> 历史平台仍有 53,901 个订单项(¥389.12 万)未归一,不属于 P1 范围;人工历史成本按既定口径不补录,因此人工毛利当前是“收入已归商品、成本仅新单有”的状态。
|
||||
> 分支事实:以上实现已快进合并到 `dev`;迁移 `103–111` **未推送远端、未部署生产**。生产口径仍以 `main` 为准。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user