|
|
@@ -335,119 +335,111 @@ class ItemFreeze
|
|
|
$originalFrozenQuantity = $freezeLog->quantity;
|
|
|
$currentQuantity = $frozenItem->quantity;
|
|
|
|
|
|
- if ($currentQuantity <= 0) {
|
|
|
- // 冻结堆已被完全消耗,无法解冻
|
|
|
- throw new Exception("冻结日志 {$freezeLogId} 对应的冻结物品已被完全消耗,无法解冻");
|
|
|
- }
|
|
|
-
|
|
|
// 检查是否需要补足差额
|
|
|
$shortageQuantity = $originalFrozenQuantity - $currentQuantity;
|
|
|
|
|
|
+ if ($currentQuantity <= 0) {
|
|
|
+ // 冻结堆已被完全消耗,需要从其他冻结堆中完全补足
|
|
|
+ $shortageQuantity = $originalFrozenQuantity; // 需要补足全部原始数量
|
|
|
+ }
|
|
|
+
|
|
|
if ($shortageQuantity > 0) {
|
|
|
- // 冻结堆被部分消耗,需要从用户其他可用物品中补足
|
|
|
- $availableQuantity = self::getAvailableQuantity(
|
|
|
+ // 冻结堆被部分消耗,需要从用户其他冻结物品中解冻来补足
|
|
|
+ $otherFrozenQuantity = self::getOtherFrozenQuantity(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
- $frozenItem->instance_id
|
|
|
+ $frozenItem->instance_id,
|
|
|
+ $freezeLogId
|
|
|
);
|
|
|
|
|
|
- if ($availableQuantity < $shortageQuantity) {
|
|
|
+ if ($otherFrozenQuantity < $shortageQuantity) {
|
|
|
throw new Exception(
|
|
|
"解冻失败:原始冻结数量 {$originalFrozenQuantity},当前冻结剩余 {$currentQuantity}," .
|
|
|
- "需要补足 {$shortageQuantity},但用户可用数量只有 {$availableQuantity}"
|
|
|
+ "需要补足 {$shortageQuantity},但用户其他冻结数量只有 {$otherFrozenQuantity}"
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- // 从用户可用物品中扣除差额,补足到冻结堆(使用锁定避免并发问题)
|
|
|
- $availableItems = ItemUser::where('user_id', $frozenItem->user_id)
|
|
|
+ // 从用户其他冻结物品中解冻来补足(使用锁定避免并发问题)
|
|
|
+ $otherFrozenItems = ItemUser::where('user_id', $frozenItem->user_id)
|
|
|
->where('item_id', $frozenItem->item_id)
|
|
|
- ->where('is_frozen', false)
|
|
|
- ->whereNull('instance_id')
|
|
|
+ ->where('instance_id', $frozenItem->instance_id)
|
|
|
+ ->where('is_frozen', true)
|
|
|
+ ->where('frozen_log_id', '!=', $freezeLogId)
|
|
|
->where('quantity', '>', 0)
|
|
|
->orderBy('expire_at')
|
|
|
->lockForUpdate() // 锁定记录,避免并发修改
|
|
|
->get();
|
|
|
|
|
|
- // 重新验证可用数量(锁定后可能已变化)
|
|
|
- $actualAvailableQuantity = $availableItems->sum('quantity');
|
|
|
- if ($actualAvailableQuantity < $shortageQuantity) {
|
|
|
+ // 重新验证其他冻结数量(锁定后可能已变化)
|
|
|
+ $actualOtherFrozenQuantity = $otherFrozenItems->sum('quantity');
|
|
|
+ if ($actualOtherFrozenQuantity < $shortageQuantity) {
|
|
|
throw new Exception(
|
|
|
- "解冻失败:需要补足 {$shortageQuantity},但锁定后用户可用数量只有 {$actualAvailableQuantity}"
|
|
|
+ "解冻失败:需要补足 {$shortageQuantity},但锁定后用户其他冻结数量只有 {$actualOtherFrozenQuantity}"
|
|
|
);
|
|
|
}
|
|
|
|
|
|
$remainingShortage = $shortageQuantity;
|
|
|
- $transferDetails = []; // 记录转移详情
|
|
|
+ $unfreezeDetails = []; // 记录解冻详情
|
|
|
|
|
|
- foreach ($availableItems as $availableItem) {
|
|
|
+ foreach ($otherFrozenItems as $otherFrozenItem) {
|
|
|
if ($remainingShortage <= 0) break;
|
|
|
|
|
|
- $deductQuantity = min($availableItem->quantity, $remainingShortage);
|
|
|
- $oldQuantity = $availableItem->quantity;
|
|
|
- $newQuantity = $oldQuantity - $deductQuantity;
|
|
|
+ $unfreezeQuantity = min($otherFrozenItem->quantity, $remainingShortage);
|
|
|
+ $oldQuantity = $otherFrozenItem->quantity;
|
|
|
+ $newQuantity = $oldQuantity - $unfreezeQuantity;
|
|
|
|
|
|
- // 更新可用物品数量
|
|
|
- $availableItem->quantity = $newQuantity;
|
|
|
- $availableItem->save();
|
|
|
+ // 从其他冻结堆中解冻指定数量
|
|
|
+ $otherFrozenItem->quantity = $newQuantity;
|
|
|
+ $otherFrozenItem->save();
|
|
|
|
|
|
- // 记录转移详情
|
|
|
- $transferDetails[] = [
|
|
|
- 'from_user_item_id' => $availableItem->id,
|
|
|
- 'transferred_quantity' => $deductQuantity,
|
|
|
+ // 记录解冻详情
|
|
|
+ $unfreezeDetails[] = [
|
|
|
+ 'from_frozen_item_id' => $otherFrozenItem->id,
|
|
|
+ 'from_freeze_log_id' => $otherFrozenItem->frozen_log_id,
|
|
|
+ 'unfrozen_quantity' => $unfreezeQuantity,
|
|
|
'old_quantity' => $oldQuantity,
|
|
|
'new_quantity' => $newQuantity,
|
|
|
];
|
|
|
|
|
|
- // 记录交易日志(从可用物品扣除)
|
|
|
- \App\Module\GameItems\Logics\Item::logTransaction(
|
|
|
+ // 记录解冻日志(从其他冻结堆解冻)
|
|
|
+ ItemFreezeLog::createLog(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
- null,
|
|
|
- -$deductQuantity,
|
|
|
- TRANSACTION_TYPE::TRADE_OUT, // 使用交易失去类型
|
|
|
- 'unfreeze_compensation',
|
|
|
- $freezeLogId,
|
|
|
- ["解冻补足转移:从可用物品转移 {$deductQuantity} 个到冻结堆"]
|
|
|
+ $frozenItem->instance_id,
|
|
|
+ $unfreezeQuantity,
|
|
|
+ FREEZE_ACTION_TYPE::UNFREEZE,
|
|
|
+ "解冻补足:从冻结堆 {$otherFrozenItem->frozen_log_id} 解冻 {$unfreezeQuantity} 个用于补足解冻日志 {$freezeLogId}",
|
|
|
+ $freezeLog->source_id,
|
|
|
+ $freezeLog->source_type,
|
|
|
+ $freezeLog->operator_id
|
|
|
);
|
|
|
|
|
|
- // 触发物品数量变更事件(可用物品减少)
|
|
|
+ // 触发物品数量变更事件(其他冻结堆减少)
|
|
|
event(new ItemQuantityChanged(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
- null,
|
|
|
+ $frozenItem->instance_id,
|
|
|
$oldQuantity,
|
|
|
$newQuantity,
|
|
|
- $availableItem->id,
|
|
|
- false, // 旧冻结状态:未冻结
|
|
|
- false, // 新冻结状态:未冻结
|
|
|
+ $otherFrozenItem->id,
|
|
|
+ true, // 旧冻结状态:已冻结
|
|
|
+ true, // 新冻结状态:仍冻结(如果数量>0)或未冻结(如果数量=0)
|
|
|
[
|
|
|
- 'action' => 'unfreeze_compensation_transfer_out',
|
|
|
- 'freeze_log_id' => $freezeLogId,
|
|
|
- 'transferred_quantity' => $deductQuantity,
|
|
|
+ 'action' => 'unfreeze_compensation_from_other_frozen',
|
|
|
+ 'target_freeze_log_id' => $freezeLogId,
|
|
|
+ 'unfrozen_quantity' => $unfreezeQuantity,
|
|
|
]
|
|
|
));
|
|
|
|
|
|
- $remainingShortage -= $deductQuantity;
|
|
|
+ $remainingShortage -= $unfreezeQuantity;
|
|
|
}
|
|
|
|
|
|
- // 将补足的数量加到冻结堆
|
|
|
+ // 将补足的数量加到目标冻结堆
|
|
|
$oldFrozenQuantity = $frozenItem->quantity;
|
|
|
$frozenItem->quantity = $originalFrozenQuantity;
|
|
|
$frozenItem->save();
|
|
|
|
|
|
- // 记录交易日志(向冻结堆补足)
|
|
|
- \App\Module\GameItems\Logics\Item::logTransaction(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- $frozenItem->instance_id,
|
|
|
- $shortageQuantity,
|
|
|
- TRANSACTION_TYPE::TRADE_IN, // 使用交易获得类型
|
|
|
- 'unfreeze_compensation',
|
|
|
- $freezeLogId,
|
|
|
- ["解冻补足转移:向冻结堆补足 {$shortageQuantity} 个,转移详情:" . json_encode($transferDetails)]
|
|
|
- );
|
|
|
-
|
|
|
- // 触发物品数量变更事件(冻结堆增加)
|
|
|
+ // 触发物品数量变更事件(目标冻结堆增加)
|
|
|
event(new ItemQuantityChanged(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
@@ -458,10 +450,10 @@ class ItemFreeze
|
|
|
true, // 旧冻结状态:已冻结
|
|
|
true, // 新冻结状态:已冻结
|
|
|
[
|
|
|
- 'action' => 'unfreeze_compensation_transfer_in',
|
|
|
+ 'action' => 'unfreeze_compensation_target_increase',
|
|
|
'freeze_log_id' => $freezeLogId,
|
|
|
'compensated_quantity' => $shortageQuantity,
|
|
|
- 'transfer_details' => $transferDetails,
|
|
|
+ 'unfreeze_details' => $unfreezeDetails,
|
|
|
]
|
|
|
));
|
|
|
}
|
|
|
@@ -817,253 +809,102 @@ class ItemFreeze
|
|
|
$originalFrozenQuantity = $freezeLog->quantity;
|
|
|
$currentQuantity = $frozenItem->quantity;
|
|
|
|
|
|
- if ($currentQuantity <= 0) {
|
|
|
- // 冻结堆已被完全消耗,尝试从用户其他可用物品中补足
|
|
|
- $availableQuantity = self::getAvailableQuantity(
|
|
|
+ // 计算需要补足的数量
|
|
|
+ $shortageQuantity = $originalFrozenQuantity - $currentQuantity;
|
|
|
+
|
|
|
+ if ($shortageQuantity > 0) {
|
|
|
+ // 需要补足分支:从其他冻结堆中解冻来补足
|
|
|
+ $otherFrozenQuantity = self::getOtherFrozenQuantity(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
- $frozenItem->instance_id
|
|
|
+ $frozenItem->instance_id,
|
|
|
+ $freezeLogId
|
|
|
);
|
|
|
|
|
|
- if ($availableQuantity < $originalFrozenQuantity) {
|
|
|
+ if ($otherFrozenQuantity < $shortageQuantity) {
|
|
|
throw new Exception(
|
|
|
- "安全解冻失败:冻结物品已被完全消耗,需要补足 {$originalFrozenQuantity},但用户可用数量只有 {$availableQuantity}"
|
|
|
+ "安全解冻失败:需要补足 {$shortageQuantity},但用户其他冻结数量只有 {$otherFrozenQuantity}"
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- // 从用户可用物品中补足全部数量(使用锁定避免并发问题)
|
|
|
- $availableItems = ItemUser::where('user_id', $frozenItem->user_id)
|
|
|
+ // 从其他冻结物品中解冻来补足
|
|
|
+ $otherFrozenItems = ItemUser::where('user_id', $frozenItem->user_id)
|
|
|
->where('item_id', $frozenItem->item_id)
|
|
|
- ->where('is_frozen', false)
|
|
|
- ->whereNull('instance_id')
|
|
|
+ ->where('instance_id', $frozenItem->instance_id)
|
|
|
+ ->where('is_frozen', true)
|
|
|
+ ->where('frozen_log_id', '!=', $freezeLogId)
|
|
|
->where('quantity', '>', 0)
|
|
|
->orderBy('expire_at')
|
|
|
- ->lockForUpdate() // 锁定记录,避免并发修改
|
|
|
+ ->lockForUpdate()
|
|
|
->get();
|
|
|
|
|
|
- // 重新验证可用数量(锁定后可能已变化)
|
|
|
- $actualAvailableQuantity = $availableItems->sum('quantity');
|
|
|
- if ($actualAvailableQuantity < $originalFrozenQuantity) {
|
|
|
+ // 重新验证其他冻结数量(锁定后可能已变化)
|
|
|
+ $actualOtherFrozenQuantity = $otherFrozenItems->sum('quantity');
|
|
|
+ if ($actualOtherFrozenQuantity < $shortageQuantity) {
|
|
|
throw new Exception(
|
|
|
- "安全解冻失败:冻结物品已被完全消耗,需要补足 {$originalFrozenQuantity},但锁定后用户可用数量只有 {$actualAvailableQuantity}"
|
|
|
+ "安全解冻失败:需要补足 {$shortageQuantity},但锁定后用户其他冻结数量只有 {$actualOtherFrozenQuantity}"
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- $remainingQuantity = $originalFrozenQuantity;
|
|
|
- $transferDetails = []; // 记录转移详情
|
|
|
+ $remainingShortage = $shortageQuantity;
|
|
|
+ $unfreezeDetails = [];
|
|
|
|
|
|
- foreach ($availableItems as $availableItem) {
|
|
|
- if ($remainingQuantity <= 0) break;
|
|
|
+ foreach ($otherFrozenItems as $otherFrozenItem) {
|
|
|
+ if ($remainingShortage <= 0) break;
|
|
|
|
|
|
- $deductQuantity = min($availableItem->quantity, $remainingQuantity);
|
|
|
- $oldQuantity = $availableItem->quantity;
|
|
|
- $newQuantity = $oldQuantity - $deductQuantity;
|
|
|
+ $unfreezeQuantity = min($otherFrozenItem->quantity, $remainingShortage);
|
|
|
+ $oldQuantity = $otherFrozenItem->quantity;
|
|
|
+ $newQuantity = $oldQuantity - $unfreezeQuantity;
|
|
|
|
|
|
- // 更新可用物品数量
|
|
|
- $availableItem->quantity = $newQuantity;
|
|
|
- $availableItem->save();
|
|
|
+ // 从其他冻结堆中减少数量
|
|
|
+ $otherFrozenItem->quantity = $newQuantity;
|
|
|
+ $otherFrozenItem->save();
|
|
|
|
|
|
- // 记录转移详情
|
|
|
- $transferDetails[] = [
|
|
|
- 'from_user_item_id' => $availableItem->id,
|
|
|
- 'transferred_quantity' => $deductQuantity,
|
|
|
+ // 记录解冻详情
|
|
|
+ $unfreezeDetails[] = [
|
|
|
+ 'from_frozen_item_id' => $otherFrozenItem->id,
|
|
|
+ 'from_freeze_log_id' => $otherFrozenItem->frozen_log_id,
|
|
|
+ 'unfrozen_quantity' => $unfreezeQuantity,
|
|
|
'old_quantity' => $oldQuantity,
|
|
|
'new_quantity' => $newQuantity,
|
|
|
];
|
|
|
|
|
|
- // 记录交易日志(从可用物品扣除)
|
|
|
- \App\Module\GameItems\Logics\Item::logTransaction(
|
|
|
+ // 记录解冻日志(从其他冻结堆解冻)
|
|
|
+ ItemFreezeLog::createLog(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
- null,
|
|
|
- -$deductQuantity,
|
|
|
- TRANSACTION_TYPE::TRADE_OUT,
|
|
|
- 'safe_unfreeze_compensation',
|
|
|
- $freezeLogId,
|
|
|
- ["安全解冻补足转移:从可用物品转移 {$deductQuantity} 个到冻结堆"]
|
|
|
+ $frozenItem->instance_id,
|
|
|
+ $unfreezeQuantity,
|
|
|
+ FREEZE_ACTION_TYPE::UNFREEZE,
|
|
|
+ "安全解冻补足:从冻结堆 {$otherFrozenItem->frozen_log_id} 解冻 {$unfreezeQuantity} 个用于补足解冻日志 {$freezeLogId}",
|
|
|
+ $freezeLog->source_id,
|
|
|
+ $freezeLog->source_type,
|
|
|
+ $freezeLog->operator_id
|
|
|
);
|
|
|
|
|
|
- // 触发物品数量变更事件(可用物品减少)
|
|
|
+ // 触发物品数量变更事件
|
|
|
event(new ItemQuantityChanged(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
- null,
|
|
|
+ $frozenItem->instance_id,
|
|
|
$oldQuantity,
|
|
|
$newQuantity,
|
|
|
- $availableItem->id,
|
|
|
- false, // 旧冻结状态:未冻结
|
|
|
- false, // 新冻结状态:未冻结
|
|
|
+ $otherFrozenItem->id,
|
|
|
+ true, // 旧冻结状态:已冻结
|
|
|
+ $newQuantity > 0, // 新冻结状态:如果数量>0仍冻结,否则解冻
|
|
|
[
|
|
|
- 'action' => 'safe_unfreeze_compensation_transfer_out',
|
|
|
- 'freeze_log_id' => $freezeLogId,
|
|
|
- 'transferred_quantity' => $deductQuantity,
|
|
|
+ 'action' => 'safe_unfreeze_compensation_from_other_frozen',
|
|
|
+ 'target_freeze_log_id' => $freezeLogId,
|
|
|
+ 'unfrozen_quantity' => $unfreezeQuantity,
|
|
|
]
|
|
|
));
|
|
|
|
|
|
- $remainingQuantity -= $deductQuantity;
|
|
|
+ $remainingShortage -= $unfreezeQuantity;
|
|
|
}
|
|
|
|
|
|
- // 恢复冻结堆到原始数量
|
|
|
- $oldFrozenQuantity = $frozenItem->quantity;
|
|
|
+ // 将补足的数量加到目标冻结堆
|
|
|
$frozenItem->quantity = $originalFrozenQuantity;
|
|
|
$frozenItem->save();
|
|
|
-
|
|
|
- // 记录交易日志(向冻结堆补足)
|
|
|
- \App\Module\GameItems\Logics\Item::logTransaction(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- $frozenItem->instance_id,
|
|
|
- $originalFrozenQuantity,
|
|
|
- TRANSACTION_TYPE::TRADE_IN,
|
|
|
- 'safe_unfreeze_compensation',
|
|
|
- $freezeLogId,
|
|
|
- ["安全解冻补足转移:向冻结堆补足 {$originalFrozenQuantity} 个,转移详情:" . json_encode($transferDetails)]
|
|
|
- );
|
|
|
-
|
|
|
- // 触发物品数量变更事件(冻结堆增加)
|
|
|
- event(new ItemQuantityChanged(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- $frozenItem->instance_id,
|
|
|
- $oldFrozenQuantity,
|
|
|
- $originalFrozenQuantity,
|
|
|
- $frozenItem->id,
|
|
|
- true, // 旧冻结状态:已冻结
|
|
|
- true, // 新冻结状态:已冻结
|
|
|
- [
|
|
|
- 'action' => 'safe_unfreeze_compensation_transfer_in',
|
|
|
- 'freeze_log_id' => $freezeLogId,
|
|
|
- 'compensated_quantity' => $originalFrozenQuantity,
|
|
|
- 'transfer_details' => $transferDetails,
|
|
|
- ]
|
|
|
- ));
|
|
|
-
|
|
|
- $shortageQuantity = $originalFrozenQuantity;
|
|
|
- } else {
|
|
|
- // 检查是否需要补足差额
|
|
|
- $shortageQuantity = $originalFrozenQuantity - $currentQuantity;
|
|
|
-
|
|
|
- if ($shortageQuantity > 0) {
|
|
|
- // 冻结堆被部分消耗,需要从用户其他可用物品中补足
|
|
|
- $availableQuantity = self::getAvailableQuantity(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- $frozenItem->instance_id
|
|
|
- );
|
|
|
-
|
|
|
- if ($availableQuantity < $shortageQuantity) {
|
|
|
- throw new Exception(
|
|
|
- "安全解冻失败:需要补足 {$shortageQuantity},但用户可用数量只有 {$availableQuantity}"
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- // 从用户可用物品中扣除差额,补足到冻结堆(使用锁定避免并发问题)
|
|
|
- $availableItems = ItemUser::where('user_id', $frozenItem->user_id)
|
|
|
- ->where('item_id', $frozenItem->item_id)
|
|
|
- ->where('is_frozen', false)
|
|
|
- ->whereNull('instance_id')
|
|
|
- ->where('quantity', '>', 0)
|
|
|
- ->orderBy('expire_at')
|
|
|
- ->lockForUpdate() // 锁定记录,避免并发修改
|
|
|
- ->get();
|
|
|
-
|
|
|
- // 重新验证可用数量(锁定后可能已变化)
|
|
|
- $actualAvailableQuantity = $availableItems->sum('quantity');
|
|
|
- if ($actualAvailableQuantity < $shortageQuantity) {
|
|
|
- throw new Exception(
|
|
|
- "安全解冻失败:需要补足 {$shortageQuantity},但锁定后用户可用数量只有 {$actualAvailableQuantity}"
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- $remainingShortage = $shortageQuantity;
|
|
|
- $transferDetails = []; // 记录转移详情
|
|
|
-
|
|
|
- foreach ($availableItems as $availableItem) {
|
|
|
- if ($remainingShortage <= 0) break;
|
|
|
-
|
|
|
- $deductQuantity = min($availableItem->quantity, $remainingShortage);
|
|
|
- $oldQuantity = $availableItem->quantity;
|
|
|
- $newQuantity = $oldQuantity - $deductQuantity;
|
|
|
-
|
|
|
- // 更新可用物品数量
|
|
|
- $availableItem->quantity = $newQuantity;
|
|
|
- $availableItem->save();
|
|
|
-
|
|
|
- // 记录转移详情
|
|
|
- $transferDetails[] = [
|
|
|
- 'from_user_item_id' => $availableItem->id,
|
|
|
- 'transferred_quantity' => $deductQuantity,
|
|
|
- 'old_quantity' => $oldQuantity,
|
|
|
- 'new_quantity' => $newQuantity,
|
|
|
- ];
|
|
|
-
|
|
|
- // 记录交易日志(从可用物品扣除)
|
|
|
- \App\Module\GameItems\Logics\Item::logTransaction(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- null,
|
|
|
- -$deductQuantity,
|
|
|
- TRANSACTION_TYPE::TRADE_OUT,
|
|
|
- 'safe_unfreeze_partial_compensation',
|
|
|
- $freezeLogId,
|
|
|
- ["安全解冻部分补足转移:从可用物品转移 {$deductQuantity} 个到冻结堆"]
|
|
|
- );
|
|
|
-
|
|
|
- // 触发物品数量变更事件(可用物品减少)
|
|
|
- event(new ItemQuantityChanged(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- null,
|
|
|
- $oldQuantity,
|
|
|
- $newQuantity,
|
|
|
- $availableItem->id,
|
|
|
- false, // 旧冻结状态:未冻结
|
|
|
- false, // 新冻结状态:未冻结
|
|
|
- [
|
|
|
- 'action' => 'safe_unfreeze_partial_compensation_transfer_out',
|
|
|
- 'freeze_log_id' => $freezeLogId,
|
|
|
- 'transferred_quantity' => $deductQuantity,
|
|
|
- ]
|
|
|
- ));
|
|
|
-
|
|
|
- $remainingShortage -= $deductQuantity;
|
|
|
- }
|
|
|
-
|
|
|
- // 将补足的数量加到冻结堆
|
|
|
- $oldFrozenQuantity = $frozenItem->quantity;
|
|
|
- $frozenItem->quantity = $originalFrozenQuantity;
|
|
|
- $frozenItem->save();
|
|
|
-
|
|
|
- // 记录交易日志(向冻结堆补足)
|
|
|
- \App\Module\GameItems\Logics\Item::logTransaction(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- $frozenItem->instance_id,
|
|
|
- $shortageQuantity,
|
|
|
- TRANSACTION_TYPE::TRADE_IN,
|
|
|
- 'safe_unfreeze_partial_compensation',
|
|
|
- $freezeLogId,
|
|
|
- ["安全解冻部分补足转移:向冻结堆补足 {$shortageQuantity} 个,转移详情:" . json_encode($transferDetails)]
|
|
|
- );
|
|
|
-
|
|
|
- // 触发物品数量变更事件(冻结堆增加)
|
|
|
- event(new ItemQuantityChanged(
|
|
|
- $frozenItem->user_id,
|
|
|
- $frozenItem->item_id,
|
|
|
- $frozenItem->instance_id,
|
|
|
- $oldFrozenQuantity,
|
|
|
- $originalFrozenQuantity,
|
|
|
- $frozenItem->id,
|
|
|
- true, // 旧冻结状态:已冻结
|
|
|
- true, // 新冻结状态:已冻结
|
|
|
- [
|
|
|
- 'action' => 'safe_unfreeze_partial_compensation_transfer_in',
|
|
|
- 'freeze_log_id' => $freezeLogId,
|
|
|
- 'compensated_quantity' => $shortageQuantity,
|
|
|
- 'transfer_details' => $transferDetails,
|
|
|
- ]
|
|
|
- ));
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
// 创建解冻日志
|
|
|
@@ -1073,7 +914,7 @@ class ItemFreeze
|
|
|
$frozenItem->instance_id,
|
|
|
$originalFrozenQuantity,
|
|
|
FREEZE_ACTION_TYPE::UNFREEZE,
|
|
|
- "安全解冻操作,原冻结日志ID: {$freezeLogId},原始冻结数量: {$originalFrozenQuantity}" .
|
|
|
+ "安全解冻操作,原冻结日志ID: {$freezeLogId}" .
|
|
|
($shortageQuantity > 0 ? ",补足差额: {$shortageQuantity}" : ""),
|
|
|
$freezeLog->source_id,
|
|
|
$freezeLog->source_type,
|
|
|
@@ -1085,7 +926,7 @@ class ItemFreeze
|
|
|
$frozenItem->frozen_log_id = null;
|
|
|
$frozenItem->save();
|
|
|
|
|
|
- // 触发物品变更事件
|
|
|
+ // 触发解冻完成事件
|
|
|
event(new ItemQuantityChanged(
|
|
|
$frozenItem->user_id,
|
|
|
$frozenItem->item_id,
|
|
|
@@ -1096,21 +937,16 @@ class ItemFreeze
|
|
|
true, // 旧冻结状态:已冻结
|
|
|
false, // 新冻结状态:未冻结
|
|
|
[
|
|
|
- 'freeze_action' => 'safe_unfreeze',
|
|
|
+ 'action' => 'safe_unfreeze_completed',
|
|
|
'unfreeze_log_id' => $unfreezeLog->id,
|
|
|
'original_freeze_log_id' => $freezeLogId,
|
|
|
- 'original_frozen_quantity' => $originalFrozenQuantity,
|
|
|
'shortage_compensated' => $shortageQuantity,
|
|
|
- 'source_id' => $freezeLog->source_id,
|
|
|
- 'source_type' => $freezeLog->source_type,
|
|
|
- 'operator_id' => $freezeLog->operator_id,
|
|
|
+ 'compensation_details' => $unfreezeDetails ?? [],
|
|
|
]
|
|
|
));
|
|
|
|
|
|
return [
|
|
|
'success' => true,
|
|
|
- 'status' => 'unfrozen',
|
|
|
- 'message' => "成功解冻物品",
|
|
|
'user_id' => $frozenItem->user_id,
|
|
|
'item_id' => $frozenItem->item_id,
|
|
|
'instance_id' => $frozenItem->instance_id,
|
|
|
@@ -1118,6 +954,7 @@ class ItemFreeze
|
|
|
'shortage_compensated' => $shortageQuantity,
|
|
|
'user_item_id' => $frozenItem->id,
|
|
|
'unfreeze_log_id' => $unfreezeLog->id,
|
|
|
+ 'compensation_details' => $unfreezeDetails ?? [],
|
|
|
];
|
|
|
}
|
|
|
|
|
|
@@ -1174,4 +1011,24 @@ class ItemFreeze
|
|
|
|
|
|
return $statistics;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户其他冻结物品的数量(排除指定的冻结日志)
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @param int $itemId 物品ID
|
|
|
+ * @param string|null $instanceId 实例ID
|
|
|
+ * @param int $excludeFreezeLogId 要排除的冻结日志ID
|
|
|
+ * @return int 其他冻结物品的总数量
|
|
|
+ */
|
|
|
+ private static function getOtherFrozenQuantity(int $userId, int $itemId, ?string $instanceId, int $excludeFreezeLogId): int
|
|
|
+ {
|
|
|
+ return ItemUser::where('user_id', $userId)
|
|
|
+ ->where('item_id', $itemId)
|
|
|
+ ->where('instance_id', $instanceId)
|
|
|
+ ->where('is_frozen', true)
|
|
|
+ ->where('frozen_log_id', '!=', $excludeFreezeLogId)
|
|
|
+ ->where('quantity', '>', 0)
|
|
|
+ ->sum('quantity');
|
|
|
+ }
|
|
|
}
|