error.md 5.0 KB

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_DIRECTIONSELL=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类中使用了事务

这些问题需要按照文档要求进行修复,确保代码实现与业务规则文档保持一致。