任务时间: 2025年06月12日 11:11
任务类型: 功能设计
模块: GameItems
在实现匹配交易的过程中,当用户发起卖出物品订单时,需要冻结该物品,防止用户在订单处理期间使用、交易或消耗这些物品。目前GameItem模块缺少物品冻结机制,需要设计并实现完整的物品冻结功能。
is_bound)、交易状态(tradable)ItemTransactionLog记录所有物品流转TRANSACTION_TYPE、ITEM_BIND_TYPE等状态管理在item_users表中新增冻结相关字段:
is_frozen - 是否冻结状态(布尔值)freeze_log_id - 冻结日志ID,关联冻结记录表拆堆机制:冻结时将原堆叠拆分为冻结部分和可用部分两个独立记录,例如1000个物品冻结200个时,拆分为200个(冻结)+ 800个(可用)。
重要修正:ItemInstance表不需要扩展冻结字段,因为ItemInstance是物品实例表,记录的是物品的基本信息和属性,而不涉及物品归属关系。冻结功能是针对用户拥有的物品进行的操作,应该在ItemUser表中实现。
创建专门的冻结记录表item_freeze_logs用于追踪所有冻结操作,使用source_id和source_type记录操作方信息。
class FREEZE_ACTION_TYPE
{
const FREEZE = 1; // 冻结
const UNFREEZE = 2; // 解冻
}
class FREEZE_REASON_TYPE
{
const TRADE_ORDER = 'trade_order'; // 交易订单
const ADMIN_FREEZE = 'admin_freeze'; // 管理员冻结
const SYSTEM_FREEZE = 'system_freeze'; // 系统冻结
const AUCTION = 'auction'; // 拍卖
const MAIL_ATTACHMENT = 'mail_attachment'; // 邮件附件
}
is_frozen和freeze_log_idisFrozen()检查是否为冻结状态isAvailable()检查是否可用getAvailableQuantity()静态方法获取用户可用物品总数freezeLog()关联冻结日志记录修正:ItemInstance模型不需要扩展冻结相关字段和方法,冻结状态在ItemUser表中管理。
核心方法包括:
freezeNormalItem() - 冻结统一属性物品,拆堆实现,创建冻结记录freezeUniqueItem() - 冻结单独属性物品,直接标记is_frozen=trueunfreezeByLogId() - 根据冻结日志ID解冻物品,可选择合并或保持独立getAvailableQuantity() - 获取用户可用物品数量(排除冻结堆叠)checkAvailableQuantity() - 验证用户是否有足够的可用物品freezeItem() - 冻结物品unfreezeItem() - 解冻物品getAvailableQuantity() - 获取可用数量getFrozenItems() - 获取冻结物品列表app/Module/GameItems/Docs/冻结实现.md - 物品冻结功能实现思路文档本次任务成功为GameItem模块设计了完整的物品冻结功能架构,解决了匹配交易中卖出物品需要冻结的核心问题。设计方案涵盖了数据库设计、代码架构、集成方案和实现计划,为后续的代码开发提供了详细的技术指导。
设计方案具有以下特点:
该设计文档将作为GameItem模块物品冻结功能开发的重要参考资料。
版本修正内容: