任务时间: 2025年06月21日 18:19
任务类型: 错误修复
模块: Mex/Validators
根据错误日志分析,修复了Mex挂单验证器中物品数量检查逻辑不一致的问题。问题源于Validation层和Logic层使用了不同的物品数量检查方法,导致验证通过但实际操作失败。
创建订单失败:用户 39077 的物品 2 可用数量不足,无法冻结 100 个MexOrderLogic::createSellOrder() 第84行抛出异常验证层和逻辑层使用不同的数量检查方法:
ItemQuantity::getUserItemQuantity()is_frozen 条件ItemService::freezeItem()is_frozen = '' 条件用户有物品总数量足够,但部分物品已被冻结:
将 MexOrderValidator::validateUserItemQuantity() 方法改为检查可用数量:
private function validateUserItemQuantity(int $userId, int $itemId, int $requiredQuantity): bool
{
$userQuantity = ItemQuantity::getUserItemQuantity($userId, $itemId);
if ($userQuantity < $requiredQuantity) {
$this->addError("物品数量不足,当前拥有 {$userQuantity} 个,需要 {$requiredQuantity} 个");
return false;
}
return true;
}
private function validateUserItemQuantity(int $userId, int $itemId, int $requiredQuantity): bool
{
// 使用ItemService获取可用数量(排除已冻结的物品)
$availableQuantity = \App\Module\GameItems\Services\ItemService::getAvailableQuantity($userId, $itemId);
if ($availableQuantity < $requiredQuantity) {
$this->addError("可用物品数量不足,当前可用 {$availableQuantity} 个,需要 {$requiredQuantity} 个");
return false;
}
return true;
}
VALIDATE_ERROR创建订单失败:用户 39077 的物品 2 可用数量不足,无法冻结 100 个使用 php artisan debug:reproduce-error 69003573 验证:
可用物品数量不足,当前可用 22 个,需要 100 个| 方法 | 检查范围 | SQL条件 | 用途 |
|---|---|---|---|
ItemQuantity::getUserItemQuantity() |
总数量 | 无is_frozen条件 |
查看用户拥有的所有物品 |
ItemService::getAvailableQuantity() |
可用数量 | is_frozen = '' |
实际可操作的物品数量 |
is_frozen = trueis_frozen = false根据用户偏好,验证应该严格按照实际操作逻辑进行,不提供向后兼容或回退逻辑。
app/Module/Mex/Validators/MexOrderValidator.php修复Mex挂单验证器物品数量检查逻辑
- 问题:MexOrderValidator使用总物品数量验证,但Logic层使用可用数量冻结,导致验证通过但冻结失败
- 修复:将validateUserItemQuantity方法改为检查可用数量(排除已冻结物品)
- 影响:物品数量不足错误现在在Validation层正确处理,返回VALIDATE_ERROR而非系统异常
- 测试:使用debug:reproduce-error验证修复效果,错误信息从系统异常变为验证错误
docs/Validation使用示例.md