|
|
@@ -45,7 +45,13 @@ class Item
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- return $item->global_expire_at->isPast();
|
|
|
+ // 确保 global_expire_at 是 Carbon 实例
|
|
|
+ $expireAt = $item->global_expire_at;
|
|
|
+ if (is_string($expireAt)) {
|
|
|
+ $expireAt = \Carbon\Carbon::parse($expireAt);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $expireAt->isPast();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -78,7 +84,7 @@ class Item
|
|
|
// 开始事务
|
|
|
DB::beginTransaction();
|
|
|
try {
|
|
|
- // 检查用户是否已有该物品且过期时间相同
|
|
|
+ // 检查用户是否已有该物品且过期时间相同,并且未满堆叠
|
|
|
$userItem = ItemUser::where('user_id', $userId)
|
|
|
->where('item_id', $itemId)
|
|
|
->where(function ($query) use ($expireAt) {
|
|
|
@@ -89,6 +95,12 @@ class Item
|
|
|
}
|
|
|
})
|
|
|
->whereNull('instance_id')
|
|
|
+ ->where(function ($query) use ($item) {
|
|
|
+ // 如果有最大堆叠限制,只查找未满的堆叠
|
|
|
+ if ($item->max_stack > 0) {
|
|
|
+ $query->where('quantity', '<', $item->max_stack);
|
|
|
+ }
|
|
|
+ })
|
|
|
->first();
|
|
|
|
|
|
$addedQuantity = $quantity;
|
|
|
@@ -101,17 +113,29 @@ class Item
|
|
|
|
|
|
// 检查最大堆叠限制
|
|
|
if ($item->max_stack > 0 && $newQuantity > $item->max_stack) {
|
|
|
- // 超过最大堆叠,创建新堆叠
|
|
|
+ // 超过最大堆叠,先填满当前堆叠
|
|
|
+ $canAddToCurrent = $item->max_stack - $currentQuantity;
|
|
|
$userItem->quantity = $item->max_stack;
|
|
|
$userItem->save();
|
|
|
|
|
|
- // 剩余数量
|
|
|
- $remainingQuantity = $newQuantity - $item->max_stack;
|
|
|
+ // 触发物品数量变更事件(更新现有堆叠)
|
|
|
+ Event::dispatch(new ItemQuantityChanged(
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ null,
|
|
|
+ $currentQuantity,
|
|
|
+ $item->max_stack,
|
|
|
+ $userItem->id,
|
|
|
+ $options
|
|
|
+ ));
|
|
|
|
|
|
- // 递归添加剩余数量
|
|
|
- self::addNormalItem($userId, $itemId, $remainingQuantity, $options);
|
|
|
+ // 剩余数量递归添加到新堆叠
|
|
|
+ $remainingQuantity = $quantity - $canAddToCurrent;
|
|
|
+ if ($remainingQuantity > 0) {
|
|
|
+ self::addNormalItem($userId, $itemId, $remainingQuantity, $options);
|
|
|
+ }
|
|
|
|
|
|
- $addedQuantity = $quantity - $remainingQuantity;
|
|
|
+ $addedQuantity = $quantity;
|
|
|
$currentQuantity = $item->max_stack;
|
|
|
} else {
|
|
|
// 未超过最大堆叠,直接更新数量
|
|
|
@@ -133,33 +157,36 @@ class Item
|
|
|
}
|
|
|
} else {
|
|
|
// 没有该物品,创建新记录
|
|
|
+ $createQuantity = min($quantity, $item->max_stack > 0 ? $item->max_stack : $quantity);
|
|
|
$userItem = new ItemUser([
|
|
|
'user_id' => $userId,
|
|
|
'item_id' => $itemId,
|
|
|
- 'quantity' => min($quantity, $item->max_stack > 0 ? $item->max_stack : $quantity),
|
|
|
+ 'quantity' => $createQuantity,
|
|
|
'expire_at' => $expireAt,
|
|
|
]);
|
|
|
$userItem->save();
|
|
|
|
|
|
- // 如果数量超过最大堆叠,递归添加剩余数量
|
|
|
- if ($item->max_stack > 0 && $quantity > $item->max_stack) {
|
|
|
- $remainingQuantity = $quantity - $item->max_stack;
|
|
|
- self::addNormalItem($userId, $itemId, $remainingQuantity, $options);
|
|
|
- $addedQuantity = $item->max_stack;
|
|
|
- }
|
|
|
-
|
|
|
- $currentQuantity = $userItem->quantity;
|
|
|
-
|
|
|
// 触发物品数量变更事件(新增物品)
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
$userId,
|
|
|
$itemId,
|
|
|
null,
|
|
|
0, // 旧数量为0
|
|
|
- $currentQuantity,
|
|
|
+ $createQuantity,
|
|
|
$userItem->id,
|
|
|
$options
|
|
|
));
|
|
|
+
|
|
|
+ // 如果数量超过最大堆叠,递归添加剩余数量
|
|
|
+ if ($item->max_stack > 0 && $quantity > $item->max_stack) {
|
|
|
+ $remainingQuantity = $quantity - $item->max_stack;
|
|
|
+ self::addNormalItem($userId, $itemId, $remainingQuantity, $options);
|
|
|
+ $addedQuantity = $quantity; // 总添加数量
|
|
|
+ } else {
|
|
|
+ $addedQuantity = $createQuantity;
|
|
|
+ }
|
|
|
+
|
|
|
+ $currentQuantity = $createQuantity;
|
|
|
}
|
|
|
|
|
|
// 记录交易日志
|