保护阈值:不影响挂单,所有订单都可以挂单并冻结资金
graph LR
A[用户可用账户] -->|资金冻结| B[用户冻结账户]
C[用户总资金] -->|保持不变| C
系统影响:无
graph LR
A[用户冻结账户] -->|解冻资金| B[用户可用账户]
C[用户总资金] -->|保持不变| C
用户物品总数:增加
graph TB
subgraph "用户账户"
A[用户冻结账户]
B[用户可用物品]
end
subgraph "仓库账户 USER_ID:15"
C[仓库可用资金]
D[仓库物品库存]
end
A -->|资金转出| C
D -->|物品转出| B
E[用户总资金] -->|减少| F[用户总资金-]
G[用户物品总数] -->|增加| H[用户物品总数+]
保护阈值:不影响挂单,所有订单都可以挂单并冻结物品
graph LR
A[用户物品可用状态] -->|物品冻结| B[用户物品冻结状态]
C[用户物品总数] -->|保持不变| C
系统影响:无
graph LR
A[用户物品冻结状态] -->|解冻物品| B[用户物品可用状态]
C[用户物品总数] -->|保持不变| C
用户物品总数:减少
graph TB
subgraph "用户账户"
A[用户可用账户]
B[用户物品可用状态]
end
subgraph "仓库账户 USER_ID:15"
C[仓库可用资金]
D[仓库物品库存]
end
C -->|资金转出| A
B -->|物品转出| D
E[用户总资金] -->|增加| F[用户总资金+]
G[用户物品总数] -->|减少| H[用户物品总数-]
flowchart TD
A[用户提交买入物品订单] --> B[资金检查]
B -->|资金充足| C[资金冻结:所有订单都冻结资金]
B -->|资金不足| Z[订单拒绝]
C --> D[创建挂单记录:不管是否超过保护阈值]
D --> E[进入撮合队列等待]
E --> F[用户买入物品撮合任务]
F --> G[MySQL查询筛选:状态=等待 AND 价格≥最高价 AND 数量≤保护阈值]
G --> H[二级排序:价格DESC,时间ASC]
H --> I[遍历符合条件的订单]
I --> J{库存匹配}
J -->|库存充足| K[执行成交]
J -->|库存不足| L[结束本次撮合]
K --> M[资金转移:用户冻结→仓库可用]
M --> N[物品转移:仓库→用户可用]
N --> O[更新库存和订单状态]
O --> P[生成成交记录]
P --> Q{是否还有订单}
Q -->|有| I
Q -->|无| R[撮合任务完成]
L --> R
flowchart TD
A[用户提交卖出物品订单] --> B[物品检查]
B -->|物品充足| C[物品冻结]
B -->|物品不足| Z[订单拒绝]
C --> D[创建挂单记录]
D --> E[进入撮合队列等待]
E --> F[用户卖出物品撮合任务]
F --> G{价格验证}
G -->|价格≤最低价| H[执行成交]
G -->|价格>最低价| I[跳过此订单]
H --> J[资金转移:仓库可用→用户可用]
J --> K[物品转移:用户冻结→仓库]
K --> L[更新库存和订单状态]
L --> M[生成成交记录]
M --> N[交易完成]
I --> O[等待下次撮合]
O --> F
graph TB
subgraph "普通用户账户"
UA[用户A可用资金]
UF[用户A冻结资金]
UI[用户A可用物品]
UIF[用户A冻结物品]
end
subgraph "仓库账户 USER_ID:15"
WF[仓库可用资金]
WI[仓库物品库存]
end
subgraph "调控账户 USER_ID:16"
CF[调控账户资金]
CI[调控账户物品]
end
UA -.->|买入挂单| UF
UF -->|买入成交| WF
WI -->|买入成交| UI
UI -.->|卖出挂单| UIF
UIF -->|卖出成交| WI
WF -->|卖出成交| UA
CF <-->|市场调控| WF
CI <-->|市场调控| WI
style WF fill:#e1f5fe
style WI fill:#e1f5fe
style CF fill:#fff3e0
style CI fill:#fff3e0
用户卖出物品价格 ≤ 最低价flowchart TD
A[用户买入物品撮合任务启动] --> B[MySQL查询获取符合条件的订单]
B --> C[筛选条件:状态=等待 AND 价格≥最高价 AND 数量≤保护阈值]
C --> D[二级排序:价格DESC,时间ASC]
D --> E[遍历排序后用户买入物品订单]
E --> F{检查库存是否充足}
F -->|充足| G[执行用户买入物品订单成交]
F -->|不足| H[结束本次撮合处理]
G --> I[资金流转:用户冻结→仓库可用]
I --> J[物品流转:仓库→用户可用]
J --> K[更新用户买入物品订单状态为已成交]
K --> L[更新系统库存数量]
L --> M[生成成交记录]
M --> N{是否还有用户买入物品订单}
N -->|有| E
N -->|无| O[用户买入物品撮合任务完成]
H --> O
O --> P[任务正常结束]
flowchart TD
A[用户卖出物品撮合任务启动] --> B[获取待撮合用户卖出物品订单]
B --> C[遍历用户卖出物品订单]
C --> D{用户卖出物品订单价格验证}
D -->|价格≤最低价| E[执行用户卖出物品订单成交]
D -->|价格>最低价| F[跳过订单,继续下一个]
E --> G[资金流转:仓库可用→用户可用]
G --> H[物品流转:用户冻结→仓库]
H --> I[更新用户卖出物品订单状态为已成交]
I --> J[更新系统库存数量]
J --> K[生成成交记录]
K --> L{是否还有用户卖出物品订单}
F --> L
L -->|有| C
L -->|无| M[用户卖出物品撮合任务完成]
M --> N[任务正常结束]
| 阶段 | 资金流向 | 物品流向 | 用户总资金变化 | 用户物品总数变化 | 系统影响 |
|---|---|---|---|---|---|
| 挂单 | 用户可用→用户冻结 | 无 | 不变 | 不变 | 无 |
| 取消挂单 | 用户冻结→用户可用 | 无 | 不变 | 不变 | 无 |
| 挂单成交 | 用户冻结→仓库可用 | 仓库→用户可用 | 减少 | 增加 | 库存减少 |
| 阶段 | 资金流向 | 物品流向 | 用户总资金变化 | 用户物品总数变化 | 系统影响 |
|---|---|---|---|---|---|
| 挂单 | 无 | 用户可用→用户冻结 | 不变 | 不变 | 无 |
| 取消挂单 | 无 | 用户冻结→用户可用 | 不变 | 不变 | 无 |
| 挂单成交 | 仓库可用→用户可用 | 用户可用→仓库 | 增加 | 减少 | 库存增加 |
app/Module/Mex/
├── Models/ # 数据模型
│ ├── MexOrder.php # 订单模型
│ ├── MexWarehouse.php # 仓库模型
│ ├── MexTransaction.php # 成交记录模型
│ └── MexPriceConfig.php # 价格配置模型
├── Services/ # 服务层
│ ├── MexOrderService.php # 订单服务
│ ├── MexMatchService.php # 撮合服务
│ └── MexWarehouseService.php # 仓库服务
├── Logic/ # 逻辑层
│ ├── MexOrderLogic.php # 订单逻辑
│ └── MexMatchLogic.php # 撮合逻辑
├── Commands/ # 计划任务
│ ├── MexUserBuyItemMatchCommand.php # 用户买入物品撮合任务
│ └── MexUserSellItemMatchCommand.php # 用户卖出物品撮合任务
├── Controllers/ # 控制器
│ └── Admin/ # 后台管理
└── Databases/ # 数据库文件
└── GenerateSql/ # SQL文件
# 添加到 crontab
# 用户买入物品撮合任务
*/5 * * * * php artisan mex:user-buy-item-match >> /var/log/mex-user-buy-item-match.log 2>&1
# 用户卖出物品撮合任务
*/5 * * * * php artisan mex:user-sell-item-match >> /var/log/mex-user-sell-item-match.log 2>&1
文档版本:v2.8 最后更新:2025年06月12日 15:30 文档状态:已移除系统总量守恒验证 更新内容: