# 工作流分析:订单创建扣减商品库存
## 工作流概览
**工作流名称:** 订单创建扣减商品库存
### 触发器
- **类型:** 操作后事件 (Action)
- **触发条件:** 当 `orders`(订单)集合执行“创建”操作时触发(全局触发)。
- **关联数据:** 触发时携带 `details`(订单明细)关联数据。
- **执行模式:** 异步
---
### 节点执行链
**[触发] 订单创建**
│
▼
**[1] 循环订单明细 (Loop)**
* **目标:** `{{$context.data.details}}`
* *操作:对每一条明细项执行以下步骤:*
│
▼
**branchIndex=0 (循环体)**
│
▼
**[2] 查询商品库存 (Query)**
* **集合:** `products`
* **过滤条件:** `id = {{$scopes.5u6lsjzf8vh.item.productId}}`
│
▼
**[3] 检查库存是否充足 (Condition)**
* **引擎:** `formula.js`
* **表达式:** `{{$jobsMapByNodeKey.n6rf8lf2lum.inventory}} < {{$scopes.5u6lsjzf8vh.item.quantity}}`
│
├── **YES (branchIndex=1, 库存不足, 条件为 TRUE):**
│ ▼
│ **[4] 通知超级管理员 (Notification)**
│ *向 root 角色用户发送通知,内容包含:*
│ *商品名称、商品 ID、当前库存、订单需求数量。*
│
└── **NO (branchIndex=0, 库存充足, 空分支)**
│
▼
**[5] 扣减库存 (SQL)**
* **SQL 语句:** `UPDATE products SET inventory = inventory - :quantity`
---
### 关键逻辑说明
| 阶段 | 说明 |
| :--- | :--- |
| **触发** | 订单创建时,系统携带 完整的订单明细列表进入工作流。 |
| **循环** | 按明细行逐项处理,每行对应一个商品及其购买数量。 |
| **查询** | 通过 `productId` 查出该商品当前库存。 |
| **判断** | 判定 `inventory < quantity` 是否为真(即是否库存不足)。 |
| **通知** | 若库存不足,向具有 `root` 角色的用户发送站内消息提醒。 |
| **扣减** | 通过 SQL 直接更新库存;由于分支汇合,无论库存是否充足都会执行扣减。 |
---
### ⚠️ 潜在 设计问题
条件节点的 `downstreamId` 指向了“扣减库存”节点,这意味着无论走哪条分支(库存充足或库存不足),最终都会汇合执行扣减操作。实际行为如下:
- **库存充足** $\rightarrow$ 直接扣减库存(正常流程)。 ✓
- **库存不足** $\rightarrow$ 先通知管理员,**随后依然执行扣减**(可能导致库存变为负数)。
**分析:** 这种设计属于“允许超卖并发出预警”的模式,也可能是一个逻辑疏忽(本意应在库存不足时阻止扣减)。需要与业务方进一步确认设计意图。
---
### 当前状态
- **启用状态:** `false`(已禁用)
- **执行记录:** 已执行过 1 次。
- **版本控制:** 当前版本处于冻结状态,如需修改需先创建新版本。