# Mex模块代码与文档不符问题总结 ## 检查时间 2025年06月12日 18:57 ## 修复时间 2025年06月12日 19:08 ## 检查范围 基于文档 `app/Module/Mex/docs/2.md` 对代码实现进行检查 ## 发现的问题 ### 1. 挂单阶段价格验证问题 ✅ 已修复 **文档要求**: - 第124行:挂单阶段无价格验证,最低价和最高价仅作为参考价格展示 - 第125-127行:所有订单都要冻结资金或物品,不管是否超过保护阈值 **代码实现问题**: - `MexPriceConfigLogic::validateOrderParams()` 方法在挂单阶段进行了价格验证 - `MexPriceConfigLogic::validateBuyPrice()` 和 `validateSellPrice()` 方法对挂单价格进行了严格验证 - `MatchexchangeAddValidation` 中使用了 `MexPriceValidator` 进行价格验证 **修复措施**: - 移除 `MatchexchangeAddValidation` 中的 `MexPriceValidator` - 创建 `validateOrderParamsForPlacement()` 方法专门用于挂单验证 - 创建 `validateOrderParamsForMatching()` 方法专门用于撮合验证 - 挂单阶段只验证价格配置存在和基本格式,不验证价格范围 **具体代码位置**: - `app/Module/Mex/Logic/MexPriceConfigLogic.php` 第277-303行 - `app/Module/Mex/Logic/MexPriceConfigLogic.php` 第83-128行、137-171行 - `app/Module/AppGame/Validations/MatchexchangeAddValidation.php` 第49-52行 ### 2. 保护阈值处理不一致 ✅ 已修复 **文档要求**: - 第56行:所有订单都可以正常挂单并冻结资金,不管是否超过保护阈值 - 第57行:超量的用户买入物品订单不参与撮合成交(保留挂单状态) - 第135-136行:挂单阶段不受保护阈值限制,撮合阶段才验证保护阈值 **代码实现问题**: - `MexPriceConfigLogic::validateOrderQuantity()` 在挂单阶段验证保护阈值 - `MexPriceConfigLogic::validateOrderParams()` 对买入订单进行数量验证 - 挂单时就拒绝超过保护阈值的订单,而不是允许挂单但不参与撮合 **修复措施**: - 挂单验证方法 `validateOrderParamsForPlacement()` 不验证保护阈值 - 撮合验证方法 `validateOrderParamsForMatching()` 才验证保护阈值 - 确保所有订单都可以挂单并冻结资金/物品 **具体代码位置**: - `app/Module/Mex/Logic/MexPriceConfigLogic.php` 第180-207行 - `app/Module/Mex/Logic/MexPriceConfigLogic.php` 第290-296行 ### 3. 撮合排序算法不符 ✅ 已修复 **文档要求**: - 第133行:二级排序:按价格从高到低(DESC),按创建时间从早到晚(ASC) - 第535行:简化为二级排序:价格DESC + 时间ASC(移除数量排序) **代码实现问题**: - `MexOrderLogic::getPendingBuyOrders()` 方法使用了三级排序 - 包含了文档中明确要求移除的数量排序 **修复措施**: - 移除数量排序 `orderBy('quantity', 'asc')` - 改为二级排序:价格DESC + 时间ASC - 添加注释说明符合文档要求 **具体代码位置**: - `app/Module/Mex/Logic/MexOrderLogic.php` 第180-183行 ### 4. 订单创建逻辑与文档不符 **文档要求**: - 第72-73行:验证价格配置是否存在(不验证价格范围和保护阈值,挂单阶段无价格验证) **代码实现问题**: - `MexOrderLogic::createBuyOrder()` 和 `createSellOrder()` 注释正确,但实际验证流程中仍有价格验证 - 验证器链条中包含价格范围验证 **具体代码位置**: - `app/Module/Mex/Logic/MexOrderLogic.php` 第70-76行 - `app/Module/Mex/Validators/MexOrderValidator.php` 整个验证流程 ### 5. 枚举值映射问题 **文档要求**: - 使用统一的买入/卖出概念 **代码实现问题**: - Protobuf枚举 `MEX_DIRECTION` 中 `SELL=1, BUY=2` - 但在某些地方可能存在映射不一致的问题 **具体代码位置**: - `protophp/Uraus/Kku/Common/MEX_DIRECTION.php` 第27-33行 ### 6. 事务处理不符合文档要求 ✅ 已修复 **文档要求**: - 逻辑层(Logic层)中不能开启事务 **代码实现问题**: - `MexMatchLogic::executeUserBuyItemMatchForItem()` 方法中使用了 `DB::transaction()` - `MexMatchLogic::executeUserSellItemMatchForItem()` 方法中使用了 `DB::transaction()` - `MexAccountLogic::processSellOrder()` 和 `processBuyOrder()` 中使用了事务 **修复措施**: - 移除 `MexMatchLogic` 中的 `DB::transaction()` - 在 `MexMatchService` 中添加事务处理 - 保留 `MexAccountLogic` 中的事务(具体业务操作需要原子性) - 添加注释说明架构要求 **具体代码位置**: - `app/Module/Mex/Logic/MexMatchLogic.php` 第209行、294行 - `app/Module/Mex/Logic/MexAccountLogic.php` 第162行等 ## 总结 主要问题集中在: 1. **挂单阶段不应该有价格验证**,但代码中存在多层价格验证 2. **保护阈值应该只影响撮合,不影响挂单**,但代码在挂单时就验证了保护阈值 3. **排序算法应该是二级排序**,但代码使用了三级排序 4. **逻辑层不应该开启事务**,但多个Logic类中使用了事务 这些问题需要按照文档要求进行修复,确保代码实现与业务规则文档保持一致。