用户反馈:模块Mex 订单123 ,没有成交,这个订单是卖出单,失败原因是'物品转移失败',就很异常
SELECT * FROM kku_mex_orders WHERE id = 123;
用户卖出物品订单撮合失败:物品流转失败:物品转移异常:用户 39077 的物品 3 数量不足,需要 100,实际 74用户39077的物品3情况:
物品消耗逻辑不支持冻结物品消耗:
ItemLogic::consumeNormalItem方法硬编码了->where('is_frozen', false)MexMatchLogic::transferFrozenItemsToWarehouse传递了'include_frozen' => true参数,但被忽略// 检查是否包含冻结物品
$includeFrozen = $options['include_frozen'] ?? false;
// 构建查询条件
$query = ItemUser::where('user_id', $userId)
->where('item_id', $itemId)
->whereNull('instance_id')
->where('quantity', '>', 0);
// 根据include_frozen参数决定是否包含冻结物品
if (!$includeFrozen) {
$query->where('is_frozen', false);
}
// 检查是否包含冻结物品
$includeFrozen = $options['include_frozen'] ?? false;
// 构建查询条件
$query = ItemUser::where('user_id', $userId)
->where('item_id', $itemId)
->where('instance_id', $instanceId);
// 根据include_frozen参数决定是否包含冻结物品
if (!$includeFrozen) {
$query->where('is_frozen', false);
}
-- 订单123状态
SELECT id, status, last_match_failure_reason FROM kku_mex_orders WHERE id = 123;
-- 结果:PENDING,物品转移失败
-- 用户物品状态
SELECT id, quantity, is_frozen FROM kku_item_users WHERE user_id = 39077 AND item_id = 3;
-- 结果:74个未冻结,2200个冻结
php artisan mex:user-sell-item-match --item=3
-- 订单123状态
SELECT id, status, completed_quantity, last_match_failure_reason FROM kku_mex_orders WHERE id = 123;
-- 结果:COMPLETED,100,null
-- 成交记录
SELECT * FROM kku_mex_transactions WHERE sell_order_id = 123;
-- 结果:成功创建成交记录
同时修复了订单112(物品2,1000个)的相同问题。
include_frozen默认为false)include_frozen=true时才包含冻结物品app/Module/GameItems/Logics/Item.php
consumeNormalItem方法支持include_frozen参数consumeUniqueItem方法支持include_frozen参数tests/Unit/GameItems/ItemConsumeFrozenTest.php:单元测试tests/manual_test_item_consume_frozen.php:手动测试脚本通过修复物品消耗逻辑中的冻结物品处理问题,成功解决了Mex模块订单撮合失败的问题。修复后:
这个修复不仅解决了当前问题,还为未来可能需要消耗冻结物品的业务场景提供了支持。